Charon

← Zurück zum Forum

Ich möchte mein erstes Projekt "Charon" nennen! Charon ist der erste Mond von Pluto - also ganz ähnlich wie Phobos der erste Mond vom Mars ist. Hier werde ich nun pö a pö das Spiel entwickeln. Es wird also ein Shooter und soll dem Spiel Phobos sehr angelehnt werden. Ich möchte es hier im Forum posten - wenn es erwünscht ist und niemanden nervt - und es soll komplett in Assembler programmiert werden. Der Code wird komplett offen liegen und über einen regen Austausch mit Tips, Verbesserungen, Ideen bin ich dankbar... also wer Lust hat, der kann sich sehr gerne rege beteiligen. Das Spiel möchte ich Schritt für Schritt entwickeln, alle Programmierklippen sollen dabei gelöst werden.

Ich programmiere auf meinem Mac unter Eclipse und WUDSN / MADS-Assembler. Folgende Schritte stelle ich mir vor: 1. Ich nehme Graphics 0 mit 16 Farben. Dazu bearbeiten wir die Charakter entsprechend. 2. Eine erste Landschaft mit Feinscrolling wird erstellt. 3. Die Landschaft wird komplexer, verschiedene Items werden eingebunden. 4. PM kommt dazu (Raumschiff, Schüsse werden simuliert) 5. Kollisionsabfragen mit entsprechenden Aktionen 6. Die Landschaften werden komplexer - verschiedene Level mit Endgegner. 7. Evt. Sonderlevel, geheime Level etc. 8. Sound / Highscore 9. Evt. 2 Spieler-Modus 10. ....

Liebe Grüße Peter

AntwortZitat

Hallo!

Kling sehr interessant. Also ich würde mich freuen, wenn man hier im Forum die Entwicklung miterleben kann und so selber ein wenig Assembler lernt. Gerade das Feinscrolling insteressiert mich... Naja, eigentlich alles 😉

Grüße

Meine Projekte findest Du hier...

AntwortZitat

Ich bin jetzt keine Leuchte in Assembler, würde mich aber trotzdem freuen die Entstehung hier verfolgen zu können (und etwas davon zu lernen) 😉

Sleeπ

AntwortZitat

... es dauert ein wenig, da ich viel auf der Arbeit zu tun habe...

Ich habe jetzt neben der Arbeit versucht dieses kleine Basic-Programm:

10 POKE 106,PEEK(106)-4
20 CB=PEEK(106)
30 GRAPHICS 0
40 CHRSET = CB*256
50 DIM CT(16)
60 FOR I=0 TO 15: CT(I)=17*I:NEXT I
70 FOR I=0 TO 15
80 FOR J=0 TO 7
90 POKE CHRSET+I*8+J,CT(I)
100 NEXT J: NEXT I
110 SCREEN=PEEK(88)+PEEK(89)*256
120 FOR I=0 TO 15: POKE SCREEN+I,I:NEXT I
130 POKE 756,CB
140 POKE 623,192
150 POKE 712,8
160 GOTO 160

In Assembler umzusetzen... das ist gar nicht so einfach wegen der Schleifen und der Multiplikationen usw.!!!!

Mein erster Ansatz (wirkt recht umständlich muss ich zugeben) war jetzt folgender:

        org $4000
cb = 106        
chrset = 180        
ct  .by 0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255
ch  .by 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120
var1 = 182

start       clc
        lda cb
        sbc #4
        sta cb
        sta chrset+1
        ldy#0
lp1     ldx#0
        clc
lp2     lda ch,y
        sty var1
        adc var1
        tay
        lda ct,y
        sta (chrset),y
        inx
        cpx  #7
        bne lp2
        iny
        cpy #15
        bne lp1
        ldy #0
        ldx #0
        clc
lp3     tya
        sta (88),y
        iny
        cpy #15
        bne lp3

        lda cb
        sta 756
        lda #192
        sta 623
        lda #8
        sta 712

lp4     jmp lp4





        run start

leider tut sich noch nichts... liegt es daran, daß ich keinen Graphics 0-Befehl eingebracht habe? Muss ich erst noch die DL konfigurieren? Wahrscheinlich hat der Code irgendein Denkfehler... am Sonntag gehe ich ihn nochmal konzentriert durch!

AntwortZitat

Prodehl schrieb: ```

start clc lda cb sbc #4 ```

... ein erster Hinweis (habe mir nur ganz flüchtig eben Deinen Beitrag angeschaut):

Für die Subtraktion "brauchst Du was zum Borgen". Die typische Sequenz sieht so aus:


        sec
        sbc #value

sonst ziehst Du einen zu viel ab...

AntwortZitat

Danke für den Hinweis "sec" !!!

... ein wenig verschlankt, ein paar weitere Fehler noch korrigiert... läuft 😉

        org $4000
cb = 106        
chrset = 180        
var1 = 182

start       lda cb
        sec
        sbc #16
        sta cb
        sta chrset+1
        ldx #0
lp1     txa
        asl
        asl
        asl
        sta chrset
lp2     lda var1
        sta (chrset),y
        iny
        cpy #7
        bne lp2
        ldy #0
        clc
        lda var1
        adc #17
        sta var1
        inx
        cpx #16
        bne lp1
lp3     tya
        sta (88),y
        iny
        cpy #16
        bne lp3
        lda cb
        sta 756
        lda #192
        sta 623
        lda #8
        sta 712

lp4     jmp lp4

        run start


ein paar Erklärungen: Tatsächlich musste ich statt 4, 16 subtrahieren, um Chaos im Charakterset zu vermeiden. Die 3 ASL bedeuten Multiplikation mit 8. Wer die Multiplikation der um 16 Subtrahierten Speicherstelle mit 256 (siehe Basic-Programm) sucht, der findet sie in dem Ausdruck: sta chrset+1 ... denn mit x256 spreche ich ja das Hi-Byte an - also packe ich den Werte einfach in chrset+1 rein und nutze dann später die indirekt indizierte Speicherstelle sta (chrset),y LG Peter

Als nächstes werden wir damit die Landschaft erstellen und das Feinscrolling aufsetzen...

AntwortZitat

Da Du ja WUDSN nutzt...

Wie wäre es, wenn Du Deine einzelnen Routinen ein wenig eingrenzt mit .PROC oder .LOCAL? Unten habe ich das mal für start gemacht. Was das bringt, siehst Du spätestens, wenn das Programm größer wird und mehrere Sprunglabels hat. Man kann im Outline und im Editor deutlich besser und schneller zu den einzelnen Teilen gehen.

Die loops habe ich auch mal etwas angepasst. Die @loops machen auch die outline etwas schmaler. @- springt zurück zum vorherigen @loop, @+ zum nächsten. Das lp1 könnte man auch mit einem @ nutzen, muss dann aber beim bne @-2 schreiben, @- würde nur zum alten lp2 springen.

Was auch sehr sinnvoll ist... Einzelne Bereiche des Programms in eigene sources zu legen und in einem "Projekt-File" diese dann zusammenzufassen und dann dieses zu assemblieren. So kann man Grafik, Spiellogik, Arithmetik etc. in getrennten und kürzeren Dateien haben und auch einfacher in anderen Projekten wieder verwenden.

Prodehl schrieb: Danke für den Hinweis "sec" !!!

... ein wenig verschlankt, ein paar weitere Fehler noch korrigiert... läuft 😉

``` org $4000 cb = 106
chrset = 180
var1 = 182

.proc start lda cb sec sbc #16 sta cb sta chrset+1 ldx #0 lp1 txa asl asl asl sta chrset @ lda var1 sta (chrset),y iny cpy #7 bne @- ldy #0 clc lda var1 adc #17 sta var1 inx cpx #16 bne lp1 @ tya sta (88),y iny cpy #16 bne @- lda cb sta 756 lda #192 sta 623 lda #8 sta 712

lp4 jmp lp4 .endp
run start

```

ein paar Erklärungen: Tatsächlich musste ich statt 4, 16 subtrahieren, um Chaos im Charakterset zu vermeiden. Die 3 ASL bedeuten Multiplikation mit 8. Wer die Multiplikation der um 16 Subtrahierten Speicherstelle mit 256 (siehe Basic-Programm) sucht, der findet sie in dem Ausdruck: sta chrset+1 ... denn mit x256 spreche ich ja das Hi-Byte an - also packe ich den Werte einfach in chrset+1 rein und nutze dann später die indirekt indizierte Speicherstelle sta (chrset),y LG Peter

Als nächstes werden wir damit die Landschaft erstellen und das Feinscrolling aufsetzen...

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

Hey lieben Dank! Die Anpassungen habe ich gleich mal übernommen. Komischerweise läuft der Loop nicht mit @-2 sondern mit @-1 ... nicht ganz logisch aber dann vielleicht doch, denn nach bne @- kommt wahrscheinlich für das Programm logisch bne @-1 und dann bne @-2 etc. Mit den Proceduren und einzelnen Projekten ist sicherlich höchst sinnvoll, um Redundanzen zu vermeiden und den Code übersichtlicher zu gestalten - natürlich wird es dann für jemand, der den Code ganz normal im Atari Assembler nachvollziehen will schwieriger... außerdem programmiere ich erst seit der Fujiyama mit WUDSN und es gibt. wenig Dokumentation oder Beispielcodes wo man lernen kann... ich muss mir fast alles selber beibringen, daher ist es echt toll, daß einige Profis mich hier ein wenig begleiten... Danke dafür!! Danke für den Austausch!! Ichdenke mit der Zeit werde ich mehr und mehr auf die Möglichkeiten des WUDSN zurückgreifen... vielleicht bekomme ich ja auf der JHV noch ein paar Anregungen und Nachhilfestunden 😉

An dieser Stelle ganz liebe Grüße auch. an Peter alias JAC 😉

P.s. meine Tastatur prellt manchmal 🙈😂

AntwortZitat

Hallo!

Als ich das erste Script von Dir, was nicht lief, nachprogrammieren wollte, ist mir aufgefallen dass Du die Speicherzellen Dezimal schreibst. Ausserdem haben bestimmte Speicherzellen wohl feste Namen. 106 ist RAMTOP und wäre Hexadezimal $6A Also wäre besser

RAMTOP EQU $6A

Desweiteren nutzt Du die Adresse 88, das wäre SAVMSC $58.

Ich denke, dass man die festen Namen zur besseren Lesbarkeit nutzen sollte.

Als letztes wäre es sehr gut, wenn man sich von Anfang an angewöhnt immer Kommentare im Quellcode zu schreiben. Je größer und länger ein Programm wird, desto schwerer findet man sich sonst zurecht.

Grüße

Meine Projekte findest Du hier...

AntwortZitat

danke für die Hinweise, ich werde das zu berücksichtigen versuchen... sicherlich alles sinnvoll was du sagst, mit Hexadezimalist für mich. schon eher gewöhnungsbedürftig! Ich hoffe morgen ein wenig Zeit fürs Feinscrolling zu finden...

AntwortZitat

ich habe das entsprechend des kleinen Rüffels angepasst:

        org $4000
ramtop = $6a        
savmsc = $58
chbas = $2f4
gprior = $26f
color4 = $2c8
chrset = 180        
var1 = 182

start       lda ramtop  ;Ramtop verändern
        sec
        sbc #16
        sta ramtop
        sta chrset+1
        ldx #0

lp1     txa ;Charakter neu definieren
        asl
        asl
        asl
        sta chrset
lp2     lda var1
        sta (chrset),y
        iny
        cpy #7
        bne lp2
        ldy #0
        clc
        lda var1
        adc #17
        sta var1
        inx
        cpx #16
        bne lp1

lp3     tya ;Die ersten 16 Charakter auf den Bildschirm bringen
        sta (savmsc),y
        iny
        cpy #16
        bne lp3

        lda ramtop  ;Basisadresse Zeichensatz neu festlegen
        sta chbas
        lda #$c0    ;GTIA Modus 3 (16 Farben) initialisieren
        sta gprior
        lda #8  ;Hintergrundfarbe / Helligkeit festlegen
        sta color4

lp4     jmp lp4

        run start

Es macht Sinn gleich von Anfang an zu dokumentieren und ein paar Remarks in den Programmcode einzubinden. Man kann es ja durchaus sparsam aber effektiv gestalten. Die Systemvariablen zu benennen mach Sinn, da der Code sich dann ebenfalls klarer und verständlicher liest. Warum in Haxedezimal? Gerade bei Adressen über 255 (also 16 Bit) läßt sich damit viel besser arbeiten, da in Hexadezimal hier gleich das Hi / Low-Byte angezeigt werden. Sinnvoll bzw. unabdingbar für jeden Programmierer erscheint mir "Das Atari Profibuch", was mir glücklicherweise (neu) vorliegt!

Allen einen schönen Sonntag! Gruß Peter

AntwortZitat

Noch ein Vorschlag zu den Systemvariablen.

Um nicht alles selbst immer wieder neu machen zu müssen, kann man auch eine "header" Datei einbinden, die schon jemand gemacht hat. Ich persönlich nutze da eine von Graph2Font erzeugte "header" Datei, die ich mittlerweile um einige Adressen ergänzt und auch einige angepasst habe. Diese Datei binde ich immer in meine Quellcodes mit ein.

Dies geschieht am besten gleich am Anfang des Quellcodes via:

    icl '../atari.hea'

Wenn Du Deinen Code auf mehrere Dateien aufteilst, bindest Du sie dann so ein:

    icl 'display/showmenu.asm'  ;ingame menu
    icl 'display/copyrestore.asm'   ;copy and restore routines
    icl 'calc/arithmetics.asm'  ;arithmetics
    icl 'calc/leveltables.asm'  ;create level tables
    icl 'logic/throwout.asm'    ;trow someone out
    icl 'sound/sound.asm'       ;sound routines
    icl 'display/gamemenu.asm'  ;gamemenu

Dies ist ein Teil aus dem Source meines Spiels, das demnächst bei SikorSoft erscheint.

Damit Du auch beim Editieren dieser "Unter Dateien" mal eben schnell den gesamten Code assemblieren kannst, muss der WUDSN die "Haupt Datei" kennen. Direkt am Anfang jeder dieser eingebundenen Sources einfach den Link zur "Haupt Datei" schreiben und man kann immer den kompletten Code assemblieren ohne erst zu dieser Datei wechseln zu müssen:

;arithmetics and conversations2screen of "runfast"
;   @com.wudsn.ide.asm.mainsourcefile=../runfast_disc.asm

Die erste Zeile ist nur eine Kurze Beschreibung, was die Datei halt so macht und kann natürlich auch weggelassen werden., das @com ist die wichtige Zeile für WUDSN.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

folgendes Problem bzw. Überlegungen: Mit relativ viel Aufwand habe ich jetzt ein altes Listing von BASIC auf Assembler konvertiert, wo man mit GR.0 16 Farben darstellen kann. Dies wollte ich für die Erstellung von Landschaften und anderen Charaktern nehmen, das Raumschiff und die Schüsse wollte ich mit PM-Grafik erstellen. Nun habe ich gesehen, daß Thomas Schulz in seinem tollen Vortrag vor ein paar Jahren sich wohl einen eigenen Bitmap Editor programmiert hat, in einen der schönen Tutoriels von Peter Dell sah ich, wie er virtuos mit Eclipse (was ich ja auf Mac auch nutze) und GrafX2 Bitmap-Grafiken erstellt... diesen Weg kann ich mit meinem Mac so nicht gehen. Ich bekomme zwar GrafX2 mit CrossOver auf meinem Mac zum laufen, aber es ist kompliziert und schlecht zu nutzen... wie das in Eclipse eingebunden werden soll... keine Ahnung. Es bleibt fast nur per Hand die Bitmaps selber zu programmieren oder ich programmiere mir auch direkt eine Art Bitmap Editor selber... gibt es noch alternativer Ideen ???? Bin für alle Vorschläge sehr offen! Gruß Peter

AntwortZitat

Hallo Peter

Frag doch mal den Thomas ob Du dir seinen Source Code mal kurz borgen kannst...

Tschüß

Mathy

Schreibe nicht der Absicht zu, was man mit Dummheit oder Ignoranz erklären kann.

AntwortZitat

Jetzt habe ich ein wenig überlegt und echt gezaudert wie ich es am besten mache... und mich entschieden den eingeschlagenen Weg für dieses erste Projekt beizubehalten nach dem Motto: Die Grafik muss noch nicht perfekt sein!! GTIA Modus 4 mit Farben und höherer Auflösung etc. mache ich später. Ich bleibe bei GTIA 3 mit 16 Farben und habe dann nicht die perfekte Auflösung, aber für den Start hier wird es mehr als ausreichen. Rom ist auch nicht an einem Tag erbaut worden und es bleibt viel Zeit für die Lernkurve und für weitere Projekte.... Auch wie ich die Charakter umbiege und umändere... ich mache das jetzt direkt per Hand und bringe es direkt in den Assemblercode rein, um Platz zu sparen:

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8

            org $2000

            .byte %00000000
            .byte %00000000
            .byte %00000000
            .byte %00000000
            .byte %00000000
            .byte %00000000
            .byte %00000000
            .byte %00000000

            .byte %11110000
            .byte %11110000
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11110000
            .byte %11110000

            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111

            .byte %00001111
            .byte %00001111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %11111111
            .byte %00001111
            .byte %00001111

            .byte %11110000
            .byte %11110000
            .byte %11110000
            .byte %11110000
            .byte %11110000
            .byte %11110000
            .byte %11110000
            .byte %11110000

            .byte %00001111
            .byte %00001111
            .byte %00001111
            .byte %00001111
            .byte %00001111
            .byte %00001111
            .byte %00001111
            .byte %00001111

            .proc main

            lda #32 ;HighByte Character Pointer auf $2000 setzen
            sta ch

            ldy #5
loop            tya ;Die ersten 6 Charakter printen
            sta (savmsc),y
            dey
            bpl loop

            lda #192    ;GTIA Modus 3 (16 Farben) initialisieren
            sta gprior
            lda #8  ;Hintergrundfarbe / Helligkeit festlegen
            sta color4

            jmp *

            .endp

            run main

Entsprechend fahre ich jetzt fort und werde noch etliche weitere Charakter definieren für die Landschaft in noch weiteren Farben und für Gebäude bzw. Items. Das Raumschiff und die Schüsse werden mittels PM definiert. Dann kommt ein Programmblock Feinscrolling, dann ein größerer Block für die Landschaft damit man das Feinscrolling testen kann und die Steuerung der PM mit Kollisionsabfragen usw...... so die nächsten Schritte!

Gruß Peter

AntwortZitat

... jetzt habe ich es noch ein wenig "eleganter" gemacht und vor die erste .byte %....... Definition das "label" chr vorgesetzt und unten dann die direkte lda #32 durch lda #>chr ersetzt! Das liest sich besser und ich werde das so auch später für die Landschaften so verwenden. Wichtig dabei ist allerdings, dass die neuen Charakter an $2000 anfangen - also an einer Speicherstelle die gerade durch 256 teilbar ist. Alles andere macht "Salat"!

AntwortZitat

... mit copy / paste und finden / ersetzen war das jetzt recht schnell erledigt und ich habe insgesamt 128 Charakter neu definiert in 16 Farben. Zur besseren Übersicht habe ich das jetzt tatsächlich von binär in hexa umgeschrieben!

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8


            org $2000

chr         .byte 0,0,0,0,0,0,0,0
            .byte $f0,$f0,$ff,$ff,$ff,$ff,$f0,$f0
            .byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
            .byte $0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f
            .byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
            .byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
            .byte $0,$0,$0,$0,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,0,0,0,0
            .byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0
            .byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f

            .byte $b0,$b0,$bb,$bb,$bb,$bb,$b0,$b0
            .byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb
            .byte $0b,$0b,$bb,$bb,$bb,$bb,$0b,$0b
            .byte $b0,$b0,$b0,$b0,$b0,$b0,$b0,$b0
            .byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
            .byte $0,$0,$0,$0,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,0,0,0,0
            .byte $b0,$b0,$b0,$b0,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,$b0,$b0,$b0,$b0
            .byte $0b,$0b,$0b,$0b,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,$0b,$0b,$0b,$0b

            .byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0
            .byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
            .byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
            .byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
            .byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
            .byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,0,0,0,0
            .byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,$e0,$e0,$e0,$e0
            .byte $0e,$0e,$0e,$0e,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,$0e,$0e,$0e,$0e

            .byte $d0,$d0,$dd,$dd,$dd,$dd,$d0,$d0
            .byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd
            .byte $0d,$0d,$dd,$dd,$dd,$dd,$0d,$0d
            .byte $d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
            .byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
            .byte $0,$0,$0,$0,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,0,0,0,0
            .byte $d0,$d0,$d0,$d0,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,$d0,$d0,$d0,$d0
            .byte $0d,$0d,$0d,$0d,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,$0d,$0d,$0d,$0d

            .byte $c0,$c0,$cc,$cc,$cc,$cc,$c0,$c0
            .byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc
            .byte $0c,$0c,$cc,$cc,$cc,$cc,$0c,$0c
            .byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0
            .byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
            .byte $0,$0,$0,$0,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,0,0,0,0
            .byte $c0,$c0,$c0,$c0,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,$c0,$c0,$c0,$c0
            .byte $0c,$0c,$0c,$0c,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,$0c,$0c,$0c,$0c

            .byte $a0,$a0,$aa,$aa,$aa,$aa,$a0,$a0
            .byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
            .byte $0a,$0a,$aa,$aa,$aa,$aa,$0a,$0a
            .byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0
            .byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
            .byte $0,$0,$0,$0,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,0,0,0,0
            .byte $a0,$a0,$a0,$a0,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,$a0,$a0,$a0,$a0
            .byte $0a,$0a,$0a,$0a,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,$0a,$0a,$0a,$0a

            .byte $90,$90,$99,$99,$99,$99,$90,$90
            .byte $99,$99,$99,$99,$99,$99,$99,$99
            .byte $09,$09,$99,$99,$99,$99,$09,$09
            .byte $90,$90,$90,$90,$90,$90,$90,$90
            .byte $09,$09,$09,$09,$09,$09,$09,$09
            .byte $0,$0,$0,$0,$99,$99,$99,$99
            .byte $99,$99,$99,$99,0,0,0,0
            .byte $90,$90,$90,$90,$99,$99,$99,$99
            .byte $99,$99,$99,$99,$90,$90,$90,$90
            .byte $09,$09,$09,$09,$99,$99,$99,$99
            .byte $99,$99,$99,$99,$09,$09,$09,$09

            .byte $80,$80,$88,$88,$88,$88,$80,$80
            .byte $88,$88,$88,$88,$88,$88,$88,$88
            .byte $08,$08,$88,$88,$88,$88,$08,$08
            .byte $80,$80,$80,$80,$80,$80,$80,$80
            .byte $08,$08,$08,$08,$08,$08,$08,$08
            .byte $0,$0,$0,$0,$88,$88,$88,$88
            .byte $88,$88,$88,$88,0,0,0,0
            .byte $80,$80,$80,$80,$88,$88,$88,$88
            .byte $88,$88,$88,$88,$80,$80,$80,$80
            .byte $08,$08,$08,$08,$88,$88,$88,$88
            .byte $88,$88,$88,$88,$08,$08,$08,$08

            .byte $70,$70,$77,$77,$77,$77,$70,$70
            .byte $77,$77,$77,$77,$77,$77,$77,$77
            .byte $07,$07,$77,$77,$77,$77,$07,$07
            .byte $70,$70,$70,$70,$70,$70,$70,$70
            .byte $07,$07,$07,$07,$07,$07,$07,$07
            .byte $0,$0,$0,$0,$77,$77,$77,$77
            .byte $77,$77,$77,$77,0,0,0,0
            .byte $70,$70,$70,$70,$77,$77,$77,$77
            .byte $77,$77,$77,$77,$70,$70,$70,$70
            .byte $07,$07,$07,$07,$77,$77,$77,$77
            .byte $77,$77,$77,$77,$07,$07,$07,$07

            .byte $60,$60,$66,$66,$66,$66,$60,$60
            .byte $66,$66,$66,$66,$66,$66,$66,$66
            .byte $06,$06,$66,$66,$66,$66,$06,$06
            .byte $60,$60,$60,$60,$60,$60,$60,$60
            .byte $06,$06,$06,$06,$06,$06,$06,$06
            .byte $0,$0,$0,$0,$66,$66,$66,$66
            .byte $66,$66,$66,$66,0,0,0,0
            .byte $60,$60,$60,$60,$66,$66,$66,$66
            .byte $66,$66,$66,$66,$60,$60,$60,$60
            .byte $06,$06,$06,$06,$66,$66,$66,$66
            .byte $66,$66,$66,$66,$06,$06,$06,$06

            .byte $50,$50,$55,$55,$55,$55,$50,$50
            .byte $55,$55,$55,$55,$55,$55,$55,$55
            .byte $05,$05,$55,$55,$55,$55,$05,$05
            .byte $50,$50,$50,$50,$50,$50,$50,$50
            .byte $05,$05,$05,$05,$05,$05,$05,$05
            .byte $0,$0,$0,$0,$55,$55,$55,$55
            .byte $55,$55,$55,$55,0,0,0,0
            .byte $50,$50,$50,$50,$55,$55,$55,$55
            .byte $55,$55,$55,$55,$50,$50,$50,$50
            .byte $05,$05,$05,$05,$55,$55,$55,$55
            .byte $55,$55,$55,$55,$05,$05,$05,$05

            .byte $40,$40,$44,$44,$44,$44,$40,$40
            .byte $44,$44,$44,$44,$44,$44,$44,$44
            .byte $04,$04,$44,$44,$44,$44,$04,$04
            .byte $40,$40,$40,$40,$40,$40,$40,$40
            .byte $04,$04,$04,$04,$04,$04,$04,$04
            .byte $0,$0,$0,$0,$44,$44,$44,$44
            .byte $44,$44,$44,$44,0,0,0,0
            .byte $40,$40,$40,$40,$44,$44,$44,$44
            .byte $44,$44,$44,$44,$40,$40,$40,$40
            .byte $04,$04,$04,$04,$44,$44,$44,$44
            .byte $44,$44,$44,$44,$04,$04,$04,$04

            .byte $30,$30,$33,$33,$33,$33,$30,$30
            .byte $33,$33,$33,$33,$33,$33,$33,$33
            .byte $03,$03,$33,$33,$33,$33,$03,$03
            .byte $30,$30,$30,$30,$30,$30,$30,$30
            .byte $03,$03,$03,$03,$03,$03,$03,$03
            .byte $0,$0,$0,$0,$33,$33,$33,$33
            .byte $33,$33,$33,$33,0,0,0,0
            .byte $30,$30,$30,$30,$33,$33,$33,$33
            .byte $33,$33,$33,$33,$30,$30,$30,$30
            .byte $03,$03,$03,$03,$33,$33,$33,$33
            .byte $33,$33,$33,$33,$03,$03,$03,$03

            .byte $20,$20,$22,$22,$22,$22,$20,$20
            .byte $22,$22,$22,$22,$22,$22,$22,$22
            .byte $02,$02,$22,$22,$22,$22,$02,$02
            .byte $20,$20,$20,$20,$20,$20,$20,$20
            .byte $02,$02,$02,$02,$02,$02,$02,$02
            .byte $0,$0,$0,$0,$22,$22,$22,$22
            .byte $22,$22,$22,$22,0,0,0,0
            .byte $20,$20,$20,$20,$22,$22,$22,$22
            .byte $22,$22,$22,$22,$20,$20,$20,$20
            .byte $02,$02,$02,$02,$22,$22,$22,$22
            .byte $22,$22,$22,$22,$02,$02,$02,$02

            .byte $10,$10,$11,$11,$11,$11,$10,$10
            .byte $11,$11,$11,$11,$11,$11,$11,$11
            .byte $01,$01,$11,$11,$11,$11,$01,$01
            .byte $10,$10,$10,$10,$10,$10,$10,$10
            .byte $01,$01,$01,$01,$01,$01,$01,$01
            .byte $0,$0,$0,$0,$11,$11,$11,$11
            .byte $11,$11,$11,$11,0,0,0,0
            .byte $10,$10,$10,$10,$11,$11,$11,$11
            .byte $11,$11,$11,$11,$10,$10,$10,$10
            .byte $01,$01,$01,$01,$11,$11,$11,$11
            .byte $11,$11,$11,$11,$01,$01,$01,$01


            .proc main

            lda #>chr ;HighByte Character Pointer auf $2000 setzen
            sta ch

            ldy #127
loop            tya ;Die Charakter printen
            sta (savmsc),y
            dey
            bpl loop

            lda #192    ;GTIA Modus 3 (16 Farben) initialisieren
            sta gprior
            lda #8  ;Hintergrundfarbe / Helligkeit festlegen
            sta color4

            jmp *

            .endp

            run main

Damit baue ich jetzt die Landschaft.... falls die Charakter nicht reichen definiere ich mir einfach noch ein paar weitere 😉

AntwortZitat

Damit es noch übersichtlicher wird, kann man auch so schreiben:

.he 00 fe fc fd 01 0a

Es gibt auch:

.by $ff

und auch

.wo $e477

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

ich habe jetzt nochmal ein wenig mit dem Aufbau von WUDSN /MADS experimentiert und entsprechend den Code angepasst:

            org $2000

            icl '../header.txt'
            icl 'character.asm'

            .proc main

            mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
            mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
            mva #8 color4   ;Hintergrundfarbe / Helligkeit festlegen

            ;Die Charakter printen  
            ldy #127 
@           tya 
            sta (savmsc),y
            dey
            bpl @-


            jmp *

            .endp

            run main


die Charachterdatei sieht dann so aus:

;@com.wudsn.ide.asm.mainsourcefile=charon.asm




chr         .byte 0,0,0,0,0,0,0,0
            .byte $f0,$f0,$ff,$ff,$ff,$ff,$f0,$f0
            .byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
            .byte $0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f
            .byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
            .byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
            .byte $0,$0,$0,$0,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,0,0,0,0
            .byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0
            .byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f

            .byte $b0,$b0,$bb,$bb,$bb,$bb,$b0,$b0
            .byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb
            .byte $0b,$0b,$bb,$bb,$bb,$bb,$0b,$0b
            .byte $b0,$b0,$b0,$b0,$b0,$b0,$b0,$b0
            .byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
            .byte $0,$0,$0,$0,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,0,0,0,0
            .byte $b0,$b0,$b0,$b0,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,$b0,$b0,$b0,$b0
            .byte $0b,$0b,$0b,$0b,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,$0b,$0b,$0b,$0b

            .byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0
            .byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
            .byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
            .byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
            .byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
            .byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,0,0,0,0
            .byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,$e0,$e0,$e0,$e0
            .byte $0e,$0e,$0e,$0e,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,$0e,$0e,$0e,$0e

            .byte $d0,$d0,$dd,$dd,$dd,$dd,$d0,$d0
            .byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd
            .byte $0d,$0d,$dd,$dd,$dd,$dd,$0d,$0d
            .byte $d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
            .byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
            .byte $0,$0,$0,$0,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,0,0,0,0
            .byte $d0,$d0,$d0,$d0,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,$d0,$d0,$d0,$d0
            .byte $0d,$0d,$0d,$0d,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,$0d,$0d,$0d,$0d

            .byte $c0,$c0,$cc,$cc,$cc,$cc,$c0,$c0
            .byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc
            .byte $0c,$0c,$cc,$cc,$cc,$cc,$0c,$0c
            .byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0
            .byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
            .byte $0,$0,$0,$0,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,0,0,0,0
            .byte $c0,$c0,$c0,$c0,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,$c0,$c0,$c0,$c0
            .byte $0c,$0c,$0c,$0c,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,$0c,$0c,$0c,$0c

            .byte $a0,$a0,$aa,$aa,$aa,$aa,$a0,$a0
            .byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
            .byte $0a,$0a,$aa,$aa,$aa,$aa,$0a,$0a
            .byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0
            .byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
            .byte $0,$0,$0,$0,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,0,0,0,0
            .byte $a0,$a0,$a0,$a0,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,$a0,$a0,$a0,$a0
            .byte $0a,$0a,$0a,$0a,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,$0a,$0a,$0a,$0a

            .byte $90,$90,$99,$99,$99,$99,$90,$90
            .byte $99,$99,$99,$99,$99,$99,$99,$99
            .byte $09,$09,$99,$99,$99,$99,$09,$09
            .byte $90,$90,$90,$90,$90,$90,$90,$90
            .byte $09,$09,$09,$09,$09,$09,$09,$09
            .byte $0,$0,$0,$0,$99,$99,$99,$99
            .byte $99,$99,$99,$99,0,0,0,0
            .byte $90,$90,$90,$90,$99,$99,$99,$99
            .byte $99,$99,$99,$99,$90,$90,$90,$90
            .byte $09,$09,$09,$09,$99,$99,$99,$99
            .byte $99,$99,$99,$99,$09,$09,$09,$09

            .byte $80,$80,$88,$88,$88,$88,$80,$80
            .byte $88,$88,$88,$88,$88,$88,$88,$88
            .byte $08,$08,$88,$88,$88,$88,$08,$08
            .byte $80,$80,$80,$80,$80,$80,$80,$80
            .byte $08,$08,$08,$08,$08,$08,$08,$08
            .byte $0,$0,$0,$0,$88,$88,$88,$88
            .byte $88,$88,$88,$88,0,0,0,0
            .byte $80,$80,$80,$80,$88,$88,$88,$88
            .byte $88,$88,$88,$88,$80,$80,$80,$80
            .byte $08,$08,$08,$08,$88,$88,$88,$88
            .byte $88,$88,$88,$88,$08,$08,$08,$08

            .byte $70,$70,$77,$77,$77,$77,$70,$70
            .byte $77,$77,$77,$77,$77,$77,$77,$77
            .byte $07,$07,$77,$77,$77,$77,$07,$07
            .byte $70,$70,$70,$70,$70,$70,$70,$70
            .byte $07,$07,$07,$07,$07,$07,$07,$07
            .byte $0,$0,$0,$0,$77,$77,$77,$77
            .byte $77,$77,$77,$77,0,0,0,0
            .byte $70,$70,$70,$70,$77,$77,$77,$77
            .byte $77,$77,$77,$77,$70,$70,$70,$70
            .byte $07,$07,$07,$07,$77,$77,$77,$77
            .byte $77,$77,$77,$77,$07,$07,$07,$07

            .byte $60,$60,$66,$66,$66,$66,$60,$60
            .byte $66,$66,$66,$66,$66,$66,$66,$66
            .byte $06,$06,$66,$66,$66,$66,$06,$06
            .byte $60,$60,$60,$60,$60,$60,$60,$60
            .byte $06,$06,$06,$06,$06,$06,$06,$06
            .byte $0,$0,$0,$0,$66,$66,$66,$66
            .byte $66,$66,$66,$66,0,0,0,0
            .byte $60,$60,$60,$60,$66,$66,$66,$66
            .byte $66,$66,$66,$66,$60,$60,$60,$60
            .byte $06,$06,$06,$06,$66,$66,$66,$66
            .byte $66,$66,$66,$66,$06,$06,$06,$06

            .byte $50,$50,$55,$55,$55,$55,$50,$50
            .byte $55,$55,$55,$55,$55,$55,$55,$55
            .byte $05,$05,$55,$55,$55,$55,$05,$05
            .byte $50,$50,$50,$50,$50,$50,$50,$50
            .byte $05,$05,$05,$05,$05,$05,$05,$05
            .byte $0,$0,$0,$0,$55,$55,$55,$55
            .byte $55,$55,$55,$55,0,0,0,0
            .byte $50,$50,$50,$50,$55,$55,$55,$55
            .byte $55,$55,$55,$55,$50,$50,$50,$50
            .byte $05,$05,$05,$05,$55,$55,$55,$55
            .byte $55,$55,$55,$55,$05,$05,$05,$05

            .byte $40,$40,$44,$44,$44,$44,$40,$40
            .byte $44,$44,$44,$44,$44,$44,$44,$44
            .byte $04,$04,$44,$44,$44,$44,$04,$04
            .byte $40,$40,$40,$40,$40,$40,$40,$40
            .byte $04,$04,$04,$04,$04,$04,$04,$04
            .byte $0,$0,$0,$0,$44,$44,$44,$44
            .byte $44,$44,$44,$44,0,0,0,0
            .byte $40,$40,$40,$40,$44,$44,$44,$44
            .byte $44,$44,$44,$44,$40,$40,$40,$40
            .byte $04,$04,$04,$04,$44,$44,$44,$44
            .byte $44,$44,$44,$44,$04,$04,$04,$04

            .byte $30,$30,$33,$33,$33,$33,$30,$30
            .byte $33,$33,$33,$33,$33,$33,$33,$33
            .byte $03,$03,$33,$33,$33,$33,$03,$03
            .byte $30,$30,$30,$30,$30,$30,$30,$30
            .byte $03,$03,$03,$03,$03,$03,$03,$03
            .byte $0,$0,$0,$0,$33,$33,$33,$33
            .byte $33,$33,$33,$33,0,0,0,0
            .byte $30,$30,$30,$30,$33,$33,$33,$33
            .byte $33,$33,$33,$33,$30,$30,$30,$30
            .byte $03,$03,$03,$03,$33,$33,$33,$33
            .byte $33,$33,$33,$33,$03,$03,$03,$03

            .byte $20,$20,$22,$22,$22,$22,$20,$20
            .byte $22,$22,$22,$22,$22,$22,$22,$22
            .byte $02,$02,$22,$22,$22,$22,$02,$02
            .byte $20,$20,$20,$20,$20,$20,$20,$20
            .byte $02,$02,$02,$02,$02,$02,$02,$02
            .byte $0,$0,$0,$0,$22,$22,$22,$22
            .byte $22,$22,$22,$22,0,0,0,0
            .byte $20,$20,$20,$20,$22,$22,$22,$22
            .byte $22,$22,$22,$22,$20,$20,$20,$20
            .byte $02,$02,$02,$02,$22,$22,$22,$22
            .byte $22,$22,$22,$22,$02,$02,$02,$02

            .byte $10,$10,$11,$11,$11,$11,$10,$10
            .byte $11,$11,$11,$11,$11,$11,$11,$11
            .byte $01,$01,$11,$11,$11,$11,$01,$01
            .byte $10,$10,$10,$10,$10,$10,$10,$10
            .byte $01,$01,$01,$01,$01,$01,$01,$01
            .byte $0,$0,$0,$0,$11,$11,$11,$11
            .byte $11,$11,$11,$11,0,0,0,0
            .byte $10,$10,$10,$10,$11,$11,$11,$11
            .byte $11,$11,$11,$11,$10,$10,$10,$10
            .byte $01,$01,$01,$01,$11,$11,$11,$11
            .byte $11,$11,$11,$11,$01,$01,$01,$01

und die Headerdatei:

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 

Dabei nutze ich jetzt mehr die Möglichkeiten dieses Systems! Die Headerdatei habe ich ins Hauptverzeichnis geschoben und als txt abgespeichert - diese werde ich noch erweitern und sie steht allen Programmen dann zur Verfügung. Die ganzen Characterdaten und später auch die Daten für die Landschaft kommen in eigene Dateien, damit der eigentliche Code besser lesbar und programmierbar wird. Ich möchte zunehmend die Möglichkeiten von MADS nutzen, da die Befehle sinnvoll sind. Falls Fragen sind... einfach raus damit! Falls Verbesserungsvorschläge und Anregungen unserer "Profis" kommen... sehr sehr gerne!!

Damit habe ich jetzt Punkt 1 fertig und gehe direkt zu Punkt 2 über!!

LG und einen schönen Sonntag Peter

AntwortZitat

es geht weiter...

Ich habe lange rumüberlegt wie ich das scrolling mache... so wie in meinem Basic-Listing mit 2 Bildschirmen und dann entsprechend umschalten der Displaylist - oder einfach den Bildschirm komplett grobscrollen um jeweils eine Zeile nach oben und dann das Feinscrolling dazu reinbauen... ich habe mich jetzt mal zunächst für Variante 2 entschieden und zuerst eine Routine fürs Grobscrollen des gesamten Bildschirmes nach oben um eine Zeile (und dann die Wiederholungen) geschrieben. Der Code ist relativ simple und bedarf noch der eleganten Anpassung wenn alles läuft. Danach habe ich mir überlegt, wie ich die Landschaft aufbaue. Ich benötige 7 Bytes für eine Zeile und arbeite das dann im Code ab: Charakter xy x mal printen, Randcharakter xy 1 mal printen, 0 (also leer) x mal printen, Randcharakter yx 1 mal printen, Charakter yx y mal printen! Also 5 Schritte. Diese Routine bedarf sicherlich noch der Verfeinerung, läuft aber jetzt. Dazu kommt die erste Landschaft für einen kompletten Bildschirm (muss noch schöner gemacht werden) und das wiederhole ich jetzt unendlich mal... Listing:

org $2000

            icl '../header.txt'
            icl 'character.asm'
            icl 'lands.asm'



            .proc main


            mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
            mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
            mva #8 color4   ;Hintergrundfarbe / Helligkeit festlegen
            ldx #0

lp1         mva savmsc var1
            mva savmsc+1 var1+1



            ;Die letzte Reihe printen
            lda var1
            adc #32
            sta var1
            inc var1+1
            inc var1+1
            inc var1+1

            ldy lands,x ;Boarder1 holen

            sty var4
            inx
            lda lands,x

            iny
@           sta (var1),y ;Boarder1 printen
            dey
            bpl @-

            inx
            lda lands,x ;Rand Boarder1 holen
            ldy var4
            iny
            sty var4
            sta (var1),y ;Rand Boarder1 printen

            inx
            clc
            lda lands,x ;leer holen
            sta var3
            dec var3
            adc var4
            sta var4
            lda #0
@           ldy var4 ; leer printen
            sta (var1),y
            dey
            sty var4
            ldy var3
            dey
            sty var3
            bpl @-

            lda lands,x ;line counter refresh
            adc var4
            sta var4

            inx
            lda lands,x ;Rand Boarder2 holen
            ldy var4
            iny
            sty var4
            sta (var1),y ;Rand Boarder2 printen

            inx
            lda lands,x ;Boarder2 holen
            sta var3
            dec var3
            adc var4
            sta var4
            inx
            lda lands,x
@           ldy var4 ; Boarder2 printen
            sta (var1),y
            dey
            sty var4
            ldy var3
            dey
            sty var3
            bpl @-
            stx var3



bs          mva savmsc var1
            mva savmsc var2
            mva savmsc+1 var1+1
            mva savmsc+1 var2+1

            ;Den Bildschirm um eins hoch

            ldx #21
@           mva var1+1 var2+1
            clc
            lda var1
            sta var2
            adc #$28
            sta var1
            bcc @+
            inc var1+1

@           ldy #$28
@           mva (var1),y (var2),y
            dey
            bpl @-

            dex
            bpl @-2

            ldx var3
            inx
            cpx #147
            bne lp3


            jmp main

lp3         jmp lp1

            .endp

            run main


und hier noch der code für lands:

;@com.wudsn.ide.asm.mainsourcefile=test1.asm


lands           .byte 9,2,3,20,6,9,2
            .byte 9,2,8,18,10,11,2
            .byte 9,2,8,17,10,12,2
            .byte 9,2,8,16,10,13,2
            .byte 9,2,8,15,10,15,2
            .byte 9,2,8,14,10,16,2
            .byte 9,2,8,13,10,17,2
            .byte 10,2,8,12,10,17,2
            .byte 11,2,8,11,10,18,2
            .byte 12,2,8,10,10,17,2
            .byte 13,2,8,10,10,15,2
            .byte 14,2,8,10,10,14,2
            .byte 14,2,8,10,10,14,2
            .byte 13,2,8,11,10,14,2
            .byte 13,2,8,11,10,14,2
            .byte 12,2,8,12,10,14,2
            .byte 11,2,8,12,10,15,2
            .byte 13,2,8,11,10,14,2
            .byte 13,2,8,11,10,14,2
            .byte 12,2,8,12,10,14,2
            .byte 11,2,8,12,10,15,2

der Header:

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 
var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6

character bleibt gleich...

kommende Probleme: Die Daten der Landschaft bei >255 abrufen - da muss ich etwas tricksen Feinscrolling reinmachen (als nächstes)

AntwortZitat

jetzt habe ich gestern den ganzen Abend vergeblich versucht das Feinscrolling zu fixen... und entweder es geht gar nicht oder es macht Chaos... noch habe ich keine Idee warum!! Vielleicht vertragen sich die beiden Routinen (Grobscrolling - eine Zeile hoch / Feinscrolling nicht). Ich habe die Displaylist aufgebaut für Graphics 0 - die Zeilen auf 50 gesetzt damit Feinscrolling geht .... dann kommt aber Chaos! Noch weiss ich nicht, wo der Denkfehler ist.... Ich denke der Code muss komplett überarbeitet werden und vielleicht muss ich doch mit zwei Bildschirmen arbeiten und den Bildschirm über die Daten scrollen lassen... puhhhh

hier der nicht funktionierende Code:

org $2000

            icl '../header.txt'
            icl 'character.asm'
            icl 'lands.asm'
            icl 'dlist.asm'



            .proc main

            mva sdlstl var5
            mva sdlstl+1 var5+1

            ldy #0
            clc
@           lda dlist,y
            sta (var5),y
            iny
            cpy #32
            bne @-


            mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
            mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
            mva #8 color4   ;Hintergrundfarbe / Helligkeit festlegen



start       ldx #0
            clc
lp1         mva savmsc var1
            mva savmsc+1 var1+1



            ;Die letzte Reihe printen
            lda var1
            adc #32
            sta var1
            inc var1+1
            inc var1+1
            inc var1+1

            ldy lands,x ;Boarder1 holen

            sty var4
            inx
            lda lands,x

            iny
@           sta (var1),y ;Boarder1 printen
            dey
            bpl @-

            inx
            lda lands,x ;Rand Boarder1 holen
            ldy var4
            iny
            sty var4
            sta (var1),y ;Rand Boarder1 printen

            inx
            clc
            lda lands,x ;leer holen
            sta var3
            dec var3
            adc var4
            sta var4
            lda #0
@           ldy var4 ; leer printen
            sta (var1),y
            dey
            sty var4
            ldy var3
            dey
            sty var3
            bpl @-

            lda lands,x ;line counter refresh
            adc var4
            sta var4

            inx
            lda lands,x ;Rand Boarder2 holen
            ldy var4
            iny
            sty var4
            sta (var1),y ;Rand Boarder2 printen

            inx
            lda lands,x ;Boarder2 holen
            sta var3
            dec var3
            adc var4
            sta var4
            inx
            lda lands,x
@           ldy var4 ; Boarder2 printen
            sta (var1),y
            dey
            sty var4
            ldy var3
            dey
            sty var3
            bpl @-
            stx var3



            mva savmsc var1
            mva savmsc var2
            mva savmsc+1 var1+1
            mva savmsc+1 var2+1

            ;Feinscroll

            ldx #0

@           stx vscrol
            inx
            cpx #7
            bne @-



            ;Den Bildschirm um eins hoch


            ldx #21
@   

            mva var1+1 var2+1
            clc
            lda var1
            sta var2
            adc #$28
            sta var1
            bcc @+
            inc var1+1

@           ldy #$28
@           mva (var1),y (var2),y
            dey
            bpl @-

            dex
            bpl @-2

            ldx var3
            inx
            cpx #147
            bne lp3




            jmp start




lp3



            jmp lp1

            .endp

            run main


die Displaylist:

; Displaylist Graphics 0

dlist   .byte 112,112,112,114,64,156
        .byte 50,50,50,50,50,50,50,50,50,50,50,50
        .byte 50,50,50,50,50,50,50,50,50,50,50
        .byte 65,32,156

vielleicht hat ja irgendeiner die zündende Idee... LG Peter

AntwortZitat

... es liegt an der Displayliste... statt 50 muss 34 rein... glaube ich

AntwortZitat

Also gerade bei DL ist es einfacher in HEX zu arbeiten. Man sieht da deutlich, ob man spezielle Befehle oder einfache Grafikzeilen setzt.

z. B. : $02 für Gfx 0 Zeile $42 LMS +Gfx 0 $12 Hscrol + Gfx 0 $22 Vscrol + Gfx 0 $52 LMS + Hscrol + Gfx 0 $4F LMS + Gfx 8 $5E LMS + Hscrol + Gfx 15 $10 2 leere scan lines $70 8 leere scanines $F0 DLI + 8 leere scan lines $80 DLI + 1 leere scan line $C2 DLI + LMS + Gfx 0 etc.

... hoffe ich habe da jetzt aus dem Gedächtnis heraus nix vertauscht 😉

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

Hallo!

Ich habe folgendes geändert, damit eine Ausgabe kommt:

In charon.asm

    .proc main

    mva sdlstl var5
    mva sdlstl+1 var5+1
    mva savmsc smemory      ; Bildschirmspeicheradresse in Displaylist eintragen
    mva savmsc+1 smemory+1

und in dlist.asm

;@com.wudsn.ide.asm.mainsourcefile=charon.asm
; Displaylist Graphics 0

dlist   .byte $70,$70,$70,$62
smemory .word $0000
    .byte $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
    .byte $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
    .byte $41
    .word dlist

Ist aber immer noch ein Grobscrolling...

Meine Projekte findest Du hier...

AntwortZitat

Für das Feinscrollen muss natürlich auch an der richtigen Stelle (DLI am besten) das passende Hscrol oder Vscrol Register verändert werden ($D404 bzw. $D405).

    .proc main

    mwa sdlstl var5
    mwa savmsc smemory      ; Bildschirmspeicheradresse in Displaylist eintragen

Das geht auch und macht den Source kürzer.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

Lieben Dank für die interessanten Anregungen, die ich ab Montag in den Code einzubauen versuche. Inzwischen habe ich den Fehler im Code gefunden (ein # fehlte) und die Displaylist entsprechend auch geändert (die Zeilen müssen von 2 auf $20 gesetzt werden) - damit wird dann der Vertikalfeinscroll aktiviert. Danach kann man im Register $d405 Werte von 0-7 eintragen, was den Feinscroll dann auslöst. Den Code habe ich jetzt und es funktioniert... recht gut ... aber.... nicht perfekt. Feinscroll und Grobscroll laufen zeitlich ganz unterschiedlich und so musste ich Warteschleifen fürs Feinscroll einbauen, da das viel schneller abläuft. Dann geht es wirklich schön flüssig... leider... auch nicht perfekt. Ab und zu ruckelt es im Bildschirm.... ich optimiere den Code noch ein wenig und stelle es mal hier rein. Ich denke es ist. ein Zeitproblem und die Lösung wird folgende sein: Ich arbeite doch mit zwei Bildschirmen, jede Scrollausführung passiert im nicht sichtbaren Bildschirm, sobald die Aktion vollendet ist, wird umgeschaltet in den sichtbaren Bereich usw. - ich denke das löst das kleine Ruckelproblem! Vielleicht probiere ich den Code fürs Grobscrolling auch in den VBI zu packen, das könnte allerdings zeitkritisch werden... LG Peter

AntwortZitat

. Hallo Leute

Ich kenne mich mit Assembler nicht aus, kann mich aber aus Magazine aus USA erinnern das man beim Feinscrolling immer sieben (bin mir nicht ganz sicher, scheint mir aber Sinn zu machen) mal fein scrollen sollte und dann ein Mal grob. Ob das bei horizontales oder vertikales Scrolling oder beides gilt, kann Ich mich leider nicht erinnern. Ich vermute mal für beides.

Tschüß

Mathy

Schreibe nicht der Absicht zu, was man mit Dummheit oder Ignoranz erklären kann.

AntwortZitat

Hallo Mathy, das ist ganz korrekt. Im Register $D405 (für vertikal Feinscrolling) steht normalerweise 0. Ein normaler Character hat ja 8x8 Bit, wenn du nun z.B. eine 1 in das Register schreibst, dann scrolled der Rechner alle Zeichen einer Bildschirmzeile um ein Bit hoch... das macht man 7 x und dann setzt man es wieder auf 0 - damit fliegt wieder alles runter auf die Normalposition, wenn man jetzt ein Grobscrolling ausführt, ist der Ablauf einmal durchgeführt und fertig. Das geht aber nur, wenn man vorher die DL ändert: Wenn man sich jetzt die Displaylist für z.B. Gr.0 anschaut, dann startet die mit 3x 112 (Dezimal) - also 3 Leerzeilen mit der Höhe 8 Scanlines. Danach kommt 66,64,156 66 ist zusammengesetzt aus 64+2 - dabei bedeutet 64 Sprungbefehl und 2 bedeutet eine normale 8 Scanline Textzeile mit 8 Bit. Nach dem Sprungbefehl kommt 64,156 = 64+256*156 = 40000 --> hier steht der physikalische Ort der Bildschirmadresse. Änder ich diesen Sprungvektor, biege ich den Bildschirmstart woanders hin. Mit Änderung der Speicherstellen DL+5 und DL+6 (DL ist der Start der Displaylist) kann ich also in quasi Echtzeit zwischen beliebigen Bildschirmen wechseln. Nun kommen in der DL 23x die 2 - für die restlichen Zeilen und dann der Rücksprungbefehl zum Anfang der Displayliste (64,32,156 = 39968). Die verschiedenen möglichen Anweisungen sind quasi in diesem einen Byte codiert, wobei hier Bit 6 wenn es gesetzt wird (64 Dezimal) bedeutet es wird ein Sprung ausgeführt zum nachfolgeden Vektor. In Bit 5 z.B. codiert man VSCROL - also wenn es gesetzt wird (Dezimal 32) kann dies Zeile mit Änderung des VSCROL-Register D405 fein gescrolled werden. Wenn ich jetzt also z.B. alle Zeile von Gr.0 von 2 auf 32+2 (also34) setze (DL+4 muss auf 64+2+32=98 Dezimal), dann kann ich alle 24 Zeile auf einmal scrollen. Das geht auch in Basic und hat nichts mit Assembler primär zu tun.

AntwortZitat

Danke für den Link! Ich hatte mir die Seite vor Wochen schon mal angeschaut und war beeindruckt davon… leider findet man viele wichtigen include- Dateien nicht und dann läuft der Code natürlich nicht, was echt schade ist!! LG Peter

AntwortZitat

Danke Michael... gefunden!

Die Beispiele dort sind echt super und umfassend... eigentlich findet man da fast alles, was man für so einen Shooter braucht.... aber.... ich habe jetzt ja meinen eigenen Code geschrieben und möchte den auch primär verwenden. Das Feinscrolling läuft auch schon ganz gut und die Ruckler muss ich jetzt noch entfernen. Bislang habe ich auch alles hinbekommen und daraus lernt man ja immer am meisten!! Meine Erkenntnis jetzt und hier: Das Feinscrolling ganz sauber zu programmieren ist ganz nicht so einfach und bedarf eines echt sauberen Codes mit gutem und richtigen Timing, ich denke die Ruckler kommen dadurch zustande, da mein Scrolling noch nicht mit dem VBI syncronisiert ist... so passiert es halt, daß das Programm auch mal scrollen will, während der VBI läuft und den Bildschirm kurz ausschaltet... also Lösung: Entweder die Routine komplett während des VBI laufen lassen (wahrscheinlich zu lang), oder das ganze Scrolling im Hintergrund laufen zu lassen und den Bildschirm einfach umschalten wenn das Scrolling fertig ist. Das versuche ich als nächstes... jedenfalls ist es echt echt viel leichter ein Spiel zu programmieren, wo der Bildschirm fix ist 🙂

AntwortZitat

... jetzt habe ich den eigenen Code mit Feinscrolling fertig und eigentlich läuft er... manchmal perfekt ganz ohne Ruckler, dann wieder kommen gleichmäßige Ruckler rein... kann mir das nicht erklären!! Ich stelle mal den kompletten Code rein mit "includes" und zwei mov. Dateien wo man den Unterschied sieht. Vielleicht hat ja einer ne Idee... mit wsync bekomme ich es nicht gelöst!!

der Hauptcode:

                    org $2000

            icl '../header.txt'
            icl 'character.asm'
            icl 'lands.asm'
            icl 'dlist.asm'



            .proc main

            mva sdlstl var5
            mva sdlstl+1 var5+1



            ldy #0
            clc
@           lda dlist,y
            sta (var5),y
            iny
            cpy #34
            bne @-


            mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
            mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
            mva #8 color4   ;Hintergrundfarbe / Helligkeit festlegen



start       ldx #0
            clc
lp1         mva savmsc var1
            mva savmsc+1 var1+1



            ;Die letzte Reihe printen
            lda var1
            adc #152
            sta var1
            inc var1+1
            inc var1+1
            inc var1+1

            ldy lands,x ;Boarder1 holen

            sty var4
            inx
            lda lands,x

            iny
@           sta (var1),y ;Boarder1 printen
            dey
            bpl @-
                        inx
            lda lands,x ;Rand Boarder1 holen
            ldy var4
            iny
            sty var4
            sta (var1),y ;Rand Boarder1 printen
            inx
            clc
            lda lands,x ;leer holen
            sta var3
            dec var3
            adc var4
            sta var4
            lda #0
@           ldy var4 ; leer printen
            sta (var1),y
            dey
            sty var4
            ldy var3
            dey
            sty var3
            bpl @-

            lda lands,x ;line counter refresh
            adc var4
            sta var4

            inx
            lda lands,x ;Rand Boarder2 holen
            ldy var4
            iny
            sty var4

            sta (var1),y ;Rand Boarder2 printen
                        inx
            lda lands,x ;Boarder2 holen
            sta var3
            dec var3
            adc var4
            sta var4
            inx
            lda lands,x
@           ldy var4 ; Boarder2 printen

            sta (var1),y
            dey
            sty var4
            ldy var3
            dey
            sty var3
            bpl @-
            stx var3




            mva savmsc var1
            mva savmsc var2
            mva savmsc+1 var1+1
            mva savmsc+1 var2+1

            ;Feinscroll
            mva #4 delay
            jsr wartes



            mva #1 vscrol
            mva #2 delay
            jsr wartes


            mva #2 vscrol
            mva #2 delay
            jsr wartes


            mva #3 vscrol
            mva #2 delay
            jsr wartes

            mva #4 vscrol
            mva #2 delay
            jsr wartes


            mva #5 vscrol
            mva #2 delay
            jsr wartes


            mva #6 vscrol
            mva #2 delay
            jsr wartes


            mva #7 vscrol
            mva #2 delay
            jsr wartes

            mva #0 vscrol       





            ;Den Bildschirm um eins hoch


            ldx #22
@   

            mva var1+1 var2+1
            clc
            lda var1
            sta var2
            adc #$28
            sta var1
            bcc @+
            inc var1+1

@           ldy #$28
@           mva (var1),y (var2),y
            dey
            bpl @-
            dex
            bpl @-2
            ldx var3
            inx
            cpx #147
            bne lp3





            jmp start





lp3          





            jmp lp1

            .endp

wartes      
            clc
            ldx delay ; Warteschleife
st          lda RTCLOK+2    
wa          cmp RTCLOK+2    
            beq wa    
            dex            
            bpl st 
            rts


            run main

der Header im Oberverzeichnis:

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 
RTCLOk = $0012
var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
delay = $b0

die "dlist":

dlist               


        .byte 112,112,112,98,64,156
        .byte 34,34,34,34,34,34,34,34,34,34,34,34
        .byte 34,34,34,34,34,34,34,34,34,34,2
        .byte 65,32,156

lands:

lands       .byte 9,2,2,20,6,9,2
            .byte 9,2,8,18,10,11,2
            .byte 9,2,8,17,10,12,2
            .byte 9,2,8,16,10,13,2
            .byte 9,2,8,15,10,15,2
            .byte 9,2,8,14,10,16,2
            .byte 9,2,8,13,10,17,2
            .byte 10,2,8,12,10,17,2
            .byte 11,2,8,11,10,18,2
            .byte 12,2,8,10,10,17,2
            .byte 13,2,8,10,10,15,2
            .byte 14,2,8,10,10,14,2
            .byte 14,2,8,10,10,14,2
            .byte 13,2,8,11,10,14,2
            .byte 13,2,8,11,10,14,2
            .byte 12,2,8,12,10,14,2
            .byte 11,2,8,12,10,15,2
            .byte 13,2,8,11,10,14,2
            .byte 13,2,8,11,10,14,2
            .byte 12,2,8,12,10,14,2
            .byte 11,2,8,12,10,15,2

character:



chr         .byte 0,0,0,0,0,0,0,0
            .byte $f0,$f0,$ff,$ff,$ff,$ff,$f0,$f0
            .byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
            .byte $0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f
            .byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
            .byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
            .byte $0,$0,$0,$0,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,0,0,0,0
            .byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0
            .byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff
            .byte $ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f

            .byte $b0,$b0,$bb,$bb,$bb,$bb,$b0,$b0
            .byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb
            .byte $0b,$0b,$bb,$bb,$bb,$bb,$0b,$0b
            .byte $b0,$b0,$b0,$b0,$b0,$b0,$b0,$b0
            .byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
            .byte $0,$0,$0,$0,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,0,0,0,0
            .byte $b0,$b0,$b0,$b0,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,$b0,$b0,$b0,$b0
            .byte $0b,$0b,$0b,$0b,$bb,$bb,$bb,$bb
            .byte $bb,$bb,$bb,$bb,$0b,$0b,$0b,$0b

            .byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0
            .byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
            .byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
            .byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
            .byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
            .byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,0,0,0,0
            .byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,$e0,$e0,$e0,$e0
            .byte $0e,$0e,$0e,$0e,$ee,$ee,$ee,$ee
            .byte $ee,$ee,$ee,$ee,$0e,$0e,$0e,$0e

            .byte $d0,$d0,$dd,$dd,$dd,$dd,$d0,$d0
            .byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd
            .byte $0d,$0d,$dd,$dd,$dd,$dd,$0d,$0d
            .byte $d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
            .byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
            .byte $0,$0,$0,$0,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,0,0,0,0
            .byte $d0,$d0,$d0,$d0,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,$d0,$d0,$d0,$d0
            .byte $0d,$0d,$0d,$0d,$dd,$dd,$dd,$dd
            .byte $dd,$dd,$dd,$dd,$0d,$0d,$0d,$0d

            .byte $c0,$c0,$cc,$cc,$cc,$cc,$c0,$c0
            .byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc
            .byte $0c,$0c,$cc,$cc,$cc,$cc,$0c,$0c
            .byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0
            .byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
            .byte $0,$0,$0,$0,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,0,0,0,0
            .byte $c0,$c0,$c0,$c0,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,$c0,$c0,$c0,$c0
            .byte $0c,$0c,$0c,$0c,$cc,$cc,$cc,$cc
            .byte $cc,$cc,$cc,$cc,$0c,$0c,$0c,$0c

            .byte $a0,$a0,$aa,$aa,$aa,$aa,$a0,$a0
            .byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
            .byte $0a,$0a,$aa,$aa,$aa,$aa,$0a,$0a
            .byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0
            .byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
            .byte $0,$0,$0,$0,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,0,0,0,0
            .byte $a0,$a0,$a0,$a0,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,$a0,$a0,$a0,$a0
            .byte $0a,$0a,$0a,$0a,$aa,$aa,$aa,$aa
            .byte $aa,$aa,$aa,$aa,$0a,$0a,$0a,$0a

            .byte $90,$90,$99,$99,$99,$99,$90,$90
            .byte $99,$99,$99,$99,$99,$99,$99,$99
            .byte $09,$09,$99,$99,$99,$99,$09,$09
            .byte $90,$90,$90,$90,$90,$90,$90,$90
            .byte $09,$09,$09,$09,$09,$09,$09,$09
            .byte $0,$0,$0,$0,$99,$99,$99,$99
            .byte $99,$99,$99,$99,0,0,0,0
            .byte $90,$90,$90,$90,$99,$99,$99,$99
            .byte $99,$99,$99,$99,$90,$90,$90,$90
            .byte $09,$09,$09,$09,$99,$99,$99,$99
            .byte $99,$99,$99,$99,$09,$09,$09,$09

            .byte $80,$80,$88,$88,$88,$88,$80,$80
            .byte $88,$88,$88,$88,$88,$88,$88,$88
            .byte $08,$08,$88,$88,$88,$88,$08,$08
            .byte $80,$80,$80,$80,$80,$80,$80,$80
            .byte $08,$08,$08,$08,$08,$08,$08,$08
            .byte $0,$0,$0,$0,$88,$88,$88,$88
            .byte $88,$88,$88,$88,0,0,0,0
            .byte $80,$80,$80,$80,$88,$88,$88,$88
            .byte $88,$88,$88,$88,$80,$80,$80,$80
            .byte $08,$08,$08,$08,$88,$88,$88,$88
            .byte $88,$88,$88,$88,$08,$08,$08,$08

            .byte $70,$70,$77,$77,$77,$77,$70,$70
            .byte $77,$77,$77,$77,$77,$77,$77,$77
            .byte $07,$07,$77,$77,$77,$77,$07,$07
            .byte $70,$70,$70,$70,$70,$70,$70,$70
            .byte $07,$07,$07,$07,$07,$07,$07,$07
            .byte $0,$0,$0,$0,$77,$77,$77,$77
            .byte $77,$77,$77,$77,0,0,0,0
            .byte $70,$70,$70,$70,$77,$77,$77,$77
            .byte $77,$77,$77,$77,$70,$70,$70,$70
            .byte $07,$07,$07,$07,$77,$77,$77,$77
            .byte $77,$77,$77,$77,$07,$07,$07,$07

            .byte $60,$60,$66,$66,$66,$66,$60,$60
            .byte $66,$66,$66,$66,$66,$66,$66,$66
            .byte $06,$06,$66,$66,$66,$66,$06,$06
            .byte $60,$60,$60,$60,$60,$60,$60,$60
            .byte $06,$06,$06,$06,$06,$06,$06,$06
            .byte $0,$0,$0,$0,$66,$66,$66,$66
            .byte $66,$66,$66,$66,0,0,0,0
            .byte $60,$60,$60,$60,$66,$66,$66,$66
            .byte $66,$66,$66,$66,$60,$60,$60,$60
            .byte $06,$06,$06,$06,$66,$66,$66,$66
            .byte $66,$66,$66,$66,$06,$06,$06,$06

            .byte $50,$50,$55,$55,$55,$55,$50,$50
            .byte $55,$55,$55,$55,$55,$55,$55,$55
            .byte $05,$05,$55,$55,$55,$55,$05,$05
            .byte $50,$50,$50,$50,$50,$50,$50,$50
            .byte $05,$05,$05,$05,$05,$05,$05,$05
            .byte $0,$0,$0,$0,$55,$55,$55,$55
            .byte $55,$55,$55,$55,0,0,0,0
            .byte $50,$50,$50,$50,$55,$55,$55,$55
            .byte $55,$55,$55,$55,$50,$50,$50,$50
            .byte $05,$05,$05,$05,$55,$55,$55,$55
            .byte $55,$55,$55,$55,$05,$05,$05,$05

            .byte $40,$40,$44,$44,$44,$44,$40,$40
            .byte $44,$44,$44,$44,$44,$44,$44,$44
            .byte $04,$04,$44,$44,$44,$44,$04,$04
            .byte $40,$40,$40,$40,$40,$40,$40,$40
            .byte $04,$04,$04,$04,$04,$04,$04,$04
            .byte $0,$0,$0,$0,$44,$44,$44,$44
            .byte $44,$44,$44,$44,0,0,0,0
            .byte $40,$40,$40,$40,$44,$44,$44,$44
            .byte $44,$44,$44,$44,$40,$40,$40,$40
            .byte $04,$04,$04,$04,$44,$44,$44,$44
            .byte $44,$44,$44,$44,$04,$04,$04,$04

            .byte $30,$30,$33,$33,$33,$33,$30,$30
            .byte $33,$33,$33,$33,$33,$33,$33,$33
            .byte $03,$03,$33,$33,$33,$33,$03,$03
            .byte $30,$30,$30,$30,$30,$30,$30,$30
            .byte $03,$03,$03,$03,$03,$03,$03,$03
            .byte $0,$0,$0,$0,$33,$33,$33,$33
            .byte $33,$33,$33,$33,0,0,0,0
            .byte $30,$30,$30,$30,$33,$33,$33,$33
            .byte $33,$33,$33,$33,$30,$30,$30,$30
            .byte $03,$03,$03,$03,$33,$33,$33,$33
            .byte $33,$33,$33,$33,$03,$03,$03,$03

            .byte $20,$20,$22,$22,$22,$22,$20,$20
            .byte $22,$22,$22,$22,$22,$22,$22,$22
            .byte $02,$02,$22,$22,$22,$22,$02,$02
            .byte $20,$20,$20,$20,$20,$20,$20,$20
            .byte $02,$02,$02,$02,$02,$02,$02,$02
            .byte $0,$0,$0,$0,$22,$22,$22,$22
            .byte $22,$22,$22,$22,0,0,0,0
            .byte $20,$20,$20,$20,$22,$22,$22,$22
            .byte $22,$22,$22,$22,$20,$20,$20,$20
            .byte $02,$02,$02,$02,$22,$22,$22,$22
            .byte $22,$22,$22,$22,$02,$02,$02,$02

            .byte $10,$10,$11,$11,$11,$11,$10,$10
            .byte $11,$11,$11,$11,$11,$11,$11,$11
            .byte $01,$01,$11,$11,$11,$11,$01,$01
            .byte $10,$10,$10,$10,$10,$10,$10,$10
            .byte $01,$01,$01,$01,$01,$01,$01,$01
            .byte $0,$0,$0,$0,$11,$11,$11,$11
            .byte $11,$11,$11,$11,0,0,0,0
            .byte $10,$10,$10,$10,$11,$11,$11,$11
            .byte $11,$11,$11,$11,$10,$10,$10,$10
            .byte $01,$01,$01,$01,$11,$11,$11,$11
            .byte $11,$11,$11,$11,$01,$01,$01,$01

AntwortZitat

Ich habe jetzt versucht den Code etwas zu verschlanken beim Grobscroll in der Hoffnung, daß es nicht mehr ruckelt... ohne Erfolg. Die mögliche Lösung, den Grobscroll in einem nicht sichtbaren 2. Bildschirm zu machen und dann die Displaylist einfach jeweils umzuschalten, wäre wohl die Lösung und wollte ich heute umsetzen - da fiel mir aber zufällig auf, daß ich in den Einstellungen des Emulators NTSC 60 Hz eingestellt habe - also die etwas zeitaufwendigere Version des Bildschirmaufbaus - umgestellt auf PAL 50 Hz... und schon ist das gelegentliche Flackern komplett weg. Der Atari hat jetzt einfach etwas mehr Zeit und Power für den Code... Nun kann ich weitermachen! Zunächst werde ich jetzt den Aufbau der letzten Reihe - also der Landschaft komplett umprogrammieren, da ich ja aktuell nur 255 Informationen lesen kann (7 pro Zeile - also ca. 36 Zeilen) ... das würde ja nur für 1,5 Bildschirmlängen reichen und ich plane ein Landschaft mit 120-150 Bildschirmlängen - also ein Spiel, was ca. 10-15 Minuten am Stück durchscrollen könnte. Das ist auch der Grund, warum ich den Aufbau der letzten Zeile so "kompliziert" mache... einfach um Informationen / Platz zu sparen. Ich brauche so nur 7 statt 40 Byte pro Zeile. Später wird noch etwas dazukommen wegen der PM. Danach programmiere ich den ersten Player - also das Raumschiff mit entsprechender Joystickabfrage, Steuerung und Kollisionsabfrage... mal sehen was da so alles an "Problemen" auf mich zukommt 😉 LG Peter

update: Theorie und Praxis... was auf dem iMac funktioniert hat auf dem MacBook keinen positiven Einfluss... trotz 50 Hz ruckelt es noch... ich muss es wohl doch mit 2 Bildschirmen machen ...

AntwortZitat

Hallo!

Wenn das ganze so zeitkritisch ist, würde ich es auch einmal auf echter Hardware testen. Nicht das Du nachher ein Spiel rein für den Emulator geschrieben hast.

Grüße Janko

Meine Projekte findest Du hier...

AntwortZitat

neues update:

Ich habe jetzt wegen der Probleme mit dem Grobscroll (also Verschieben des kompletten Bildschirmes um eine Zeile nach unten) die Routine umprogrammiert bzw. erweitert: Ich nutze jetzt 2 Bildschirme - die letzte Zeile und das feinscroll geschieht auf dem sichtbaren Bildschirm, dann wird alles auf den unsichtbaren Bildschirm kopiert und zwar so, daß automatisch auch der grobscroll mit drin ist, anschließend schalte ich den unsichtbaren Bildschirm in der Displaylist auf sichtbar und das wiederholt sich dann ... Das hat mich den halben Montag gekostet und funktioniert jetzt sauber und ganz ohne "ruckeln". Ich werde jetzt den Code noch verfeinern und dann hier reinsetzen, wenn erwünscht!

LG Peter

AntwortZitat

Prodehl schrieb: Ich werde jetzt den Code noch verfeinern und dann hier reinsetzen, wenn erwünscht!

Ja, natürlich. Sonst kann man ja den Fortschritt nicht nachvollziehen. 🙂

Meine Projekte findest Du hier...

AntwortZitat

... hier der aktuelle Code: Die Displaylist und den Header habe ich wegen der Kürze wieder ins Hauptprogramm integriert... ist dann auch leichter hier und für mich mit den Dateien zu handeln, als icl (include) habe ich dann nur noch die Character und Landschaft... Mit der letzten Reihe bin ich noch nicht ganz zufrieden, das Feinscroll läuft jetzt aber echt gut!

der Hauptcode:

            org $2000

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 
RTCLOk = $0012
SETVBV   = $e45c
var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
var6 = $b0
var7 = $b2
delay = $b4
            icl 'character.asm'
            icl 'lands.asm' 

dlist           .byte 112,112,112,98
            .byte 30,75
            .byte 34,34,34,34,34,34,34,34,34,34,34,34
            .byte 34,34,34,34,34,34,34,34,34,34,2
            .byte 65,32,156

            .proc main

            jsr displaylist ;Subroutine Displaylist-Aufbau

start1          mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
            mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
            mva #8 color4   ;Hintergrundfarbe / Helligkeit festlegen            
            lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1
            mva <lands var6
            mva >lands var6+1

hauptprogramm

            jsr letztereihe         ;letzte Reihe (lands) Bildschirm1 printen (sichtbar)    
            jsr feinscroll          ;Feinscroll Bildschirm1 ausführen (sichtbar)

            mva #$30 var1           ;var1 auf 30000 ($7530) setzen
            mva #$75 var1+1
            mva #$f0 var2           ;var2 auf 30960 ($78f0) setzen
            mva #$78 var2+1

            jsr grobscroll          ;Bildschirm1 kopieren + grobscroll

            mva #$18 var1           ;var1 + var2 auf 31000 ($7918) setzen
            mva #$18 var2
            mva #$79 var1+1
            mva #$79 var2+1 

            jsr umschalten          ;umschalten auf Bildschirm2 - Bildschirm2 wird sichtbar
            jsr letztereihe         ;letzte Reihe (lands) Bildschirm2 printen (sichtbar)    
            jsr feinscroll          ;Feinscroll Bildschirm2 ausführen (sichtbar)                        

            mva #$08 var2           ;var1 auf 29960 ($7508) setzen
            mva #$75 var2+1
            mva #$18 var1           ;var2 auf 31000 ($7918) setzen
            mva #$79 var1+1

            jsr grobscroll          ;;Bildschirm2 kopieren + grobscroll

            mva #$30 var1           ;var1 + var2 auf 30000 ($7530) setzen
            mva #$30 var2
            mva #$75 var1+1
            mva #$75 var2+1

            jsr umschalten          ;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar

            ;Ende der Bildschirmausführung / Kontrolle Durchläufe

            sec
            lda #38                 ; - 36 = Anzahl der Durchläufe
            sbc var6+1
            bpl @+

            jmp start1                      ;Stop hier

@           jmp hauptprogramm               ;weiter

            .endp

            ; _____________________________________________________________________________________
            ;
            ; ---------------------------- S U B R O U T I N E N ----------------------------------
            ; _____________________________________________________________________________________



umschalten
            ldy #4
            mva sdlstl var5
            mva sdlstl+1 var5+1
            lda var1
            sta (var5),y
            iny
            lda var1+1
            sta (var5),y
            rts

            ; -------------------------------------------------------------------------------------

wartes      
            clc
            ldx delay ; Warteschleife
st              lda RTCLOK+2    
wa          cmp RTCLOK+2    
                beq wa    
                dex            
                bpl st 
                rts

            ; -------------------------------------------------------------------------------------

feinscroll
            ldy #1
            mva #1 delay
@           jsr wartes
            sty vscrol
            iny
            cpy #8
            bne @-          
            rts

            ; --------------------------------------------------------------------------------------

grobscroll  
            ;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile

            ldx #22
@           ldy #$28
            clc
@           mva (var1),y (var2),y
            dey
            bpl @-
            clc
            lda var1
            adc #$28
            sta var1
            bcc @+
            inc var1+1
@           clc
            lda var2
            adc #$28
            sta var2
            bcc @+
            inc var2+1          
@           clc
            dex
            bpl @-3
            rts

            ; -------------------------------------------------------------------------------

displaylist
            ; initialisiere die Displaylist
            mva sdlstl var5
            mva sdlstl+1 var5+1
            ldy #0
            clc
@           lda dlist,y
            sta (var5),y
            iny
            cpy #34
            bne @-
            rts

            ; ---------------------------------------------------------------------------------------

letztereihe
            ;Die letzte Reihe printen 
            ;Start der letzten Reihe bei var1 - Line 22
            lda var1
            adc #112
            sta var1
            inc var1+1
            inc var1+1
            inc var1+1
            ldy #0
            clc

            lda (var6),y ;Boarder1 holen
            sta var5    ;Boarderanzahl in var5 speichern
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1          
            lda (var6),y
            ldy var5

@           sta (var1),y ;Boarder1 printen
            dey
            bpl @-          
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda (var6),y ;Rand Boarder1 holen
            inc var5    ;Zeilenzähler eins weiter
            ldy var5
            sta (var1),y ;Rand Boarder1 printen
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda(var6),y ;leer holen
            tax
            lda #0
            ldy var5            
@           iny          
            sta (var1),y ; leer printen
            dex
            bpl @-

            sty var5 ;Zeilenzähler sichern
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda(var6),y ;Rand Boarder2 holen
            ldy var5
            iny
            sty var5
            sta (var1),y ;Rand Boarder2 printen
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda(var6),y ;Boarder2 holen
            tax         ;Boarderanzahl in x speichern
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  
            lda (var6),y
            ldy var5
@           iny
            sta (var1),y    ;Boarder2 printen
            dex
            bpl @-
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1
            mva #0 vscrol   
            rts

            ; ------------------------------------------------------------------------------


            run main


Landschaft: hier sind viele Zeilen erstmal dupliziert...

;@com.wudsn.ide.asm.mainsourcefile=test.asm


lands           .byte 9,2,1,20,10,9,2
            .byte 9,2,1,18,10,11,2
            .byte 9,2,1,17,10,12,2
            .byte 9,2,1,16,10,13,2
            .byte 9,2,1,15,10,15,2
            .byte 9,2,1,14,10,16,2
            .byte 9,2,1,13,10,17,2
            .byte 10,2,1,12,10,17,2
            .byte 11,2,1,11,10,18,2
            .byte 12,2,1,10,10,17,2
            .byte 13,2,1,10,10,15,2
            .byte 14,2,1,10,10,14,2
            .byte 14,2,1,10,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2

            .byte 9,2,1,20,10,9,2
            .byte 9,2,1,18,10,11,2
            .byte 9,2,1,17,10,12,2
            .byte 9,2,1,16,10,13,2
            .byte 9,2,1,15,10,15,2
            .byte 9,2,1,14,10,16,2
            .byte 9,2,1,13,10,17,2
            .byte 10,2,1,12,10,17,2
            .byte 11,2,1,11,10,18,2
            .byte 12,2,1,10,10,17,2
            .byte 13,2,1,10,10,15,2
            .byte 14,2,1,10,10,14,2
            .byte 14,2,1,10,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2

            .byte 9,2,1,20,10,9,2
            .byte 9,2,1,18,10,11,2
            .byte 9,2,1,17,10,12,2
            .byte 9,2,1,16,10,13,2
            .byte 9,2,1,15,10,15,2
            .byte 9,2,1,14,10,16,2
            .byte 9,2,1,13,10,17,2
            .byte 10,2,1,12,10,17,2
            .byte 11,2,1,11,10,18,2
            .byte 12,2,1,10,10,17,2
            .byte 13,2,1,10,10,15,2
            .byte 14,2,1,10,10,14,2
            .byte 14,2,1,10,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2

            .byte 9,2,1,20,10,9,2
            .byte 9,2,1,18,10,11,2
            .byte 9,2,1,17,10,12,2
            .byte 9,2,1,16,10,13,2
            .byte 9,2,1,15,10,15,2
            .byte 9,2,1,14,10,16,2
            .byte 9,2,1,13,10,17,2
            .byte 10,2,1,12,10,17,2
            .byte 11,2,1,11,10,18,2
            .byte 12,2,1,10,10,17,2
            .byte 13,2,1,10,10,15,2
            .byte 14,2,1,10,10,14,2
            .byte 14,2,1,10,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2
            .byte 13,2,1,11,10,14,2
            .byte 13,2,1,11,10,14,2
            .byte 12,2,1,12,10,14,2
            .byte 11,2,1,12,10,15,2

die Charaktertabelle noch unverändert zu den Vorgängerversionen:

;@com.wudsn.ide.asm.mainsourcefile=test.asm
chr         .he 0,0,0,0,0,0,0,0
            .he f0,f0,ff,ff,ff,ff,f0,f0
            .he ff,ff,ff,ff,ff,ff,ff,ff
            .he 0f,0f,ff,ff,ff,ff,0f,0f
            .he f0,f0,f0,f0,f0,f0,f0,f0
            .he 0f,0f,0f,0f,0f,0f,0f,0f
            .he 0,0,0,0,ff,ff,ff,ff
            .he ff,ff,ff,ff,0,0,0,0
            .he f0,f0,f0,f0,ff,ff,ff,ff
            .he ff,ff,ff,ff,f0,f0,f0,f0
            .he 0f,0f,0f,0f,ff,ff,ff,ff
            .he ff,ff,ff,ff,0f,0f,0f,0f

            .he e0,e0,ee,ee,ee,ee,e0,e0
            .he ee,ee,ee,ee,ee,ee,ee,ee
            .he 0e,0e,ee,ee,ee,ee,0e,0e
            .he e0,e0,e0,e0,e0,e0,e0,e0
            .he 0e,0e,0e,0e,0e,0e,0e,0e
            .he 0,0,0,0,ee,ee,ee,ee
            .he ee,ee,ee,ee,0,0,0,0
            .he e0,e0,e0,e0,ee,ee,ee,ee
            .he ee,ee,ee,ee,e0,e0,e0,e0
            .he 0e,0e,0e,0e,ee,ee,ee,ee
            .he ee,ee,ee,ee,0e,0e,0e,0e

            .he d0,d0,dd,dd,dd,dd,d0,d0
            .he dd,dd,dd,dd,dd,dd,dd,dd
            .he 0d,0d,dd,dd,dd,dd,0d,0d
            .he d0,d0,d0,d0,d0,d0,d0,d0
            .he 0d,0d,0d,0d,0d,0d,0d,0d
            .he 0,0,0,0,dd,dd,dd,dd
            .he dd,dd,dd,dd,0,0,0,0
            .he d0,d0,d0,d0,dd,dd,dd,dd
            .he dd,dd,dd,dd,d0,d0,d0,d0
            .he 0d,0d,0d,0d,dd,dd,dd,dd
            .he dd,dd,dd,dd,0d,0d,0d,0d

            .he c0,c0,cc,cc,cc,cc,c0,c0
            .he cc,cc,cc,cc,cc,cc,cc,cc
            .he 0c,0c,cc,cc,cc,cc,0c,0c
            .he c0,c0,c0,c0,c0,c0,c0,c0
            .he 0c,0c,0c,0c,0c,0c,0c,0c
            .he 0,0,0,0,cc,cc,cc,cc
            .he cc,cc,cc,cc,0,0,0,0
            .he c0,c0,c0,c0,cc,cc,cc,cc
            .he cc,cc,cc,cc,c0,c0,c0,c0
            .he 0c,0c,0c,0c,cc,cc,cc,cc
            .he cc,cc,cc,cc,0c,0c,0c,0c

            .he b0,b0,bb,bb,bb,bb,b0,b0
            .he bb,bb,bb,bb,bb,bb,bb,bb
            .he 0b,0b,bb,bb,bb,bb,0b,0b
            .he b0,b0,b0,b0,b0,b0,b0,b0
            .he 0b,0b,0b,0b,0b,0b,0b,0b
            .he 0,0,0,0,bb,bb,bb,bb
            .he bb,bb,bb,bb,0,0,0,0
            .he b0,b0,b0,b0,bb,bb,bb,bb
            .he bb,bb,bb,bb,b0,b0,b0,b0
            .he 0b,0b,0b,0b,bb,bb,bb,bb
            .he bb,bb,bb,bb,0b,0b,0b,0b

            .he a0,a0,aa,aa,aa,aa,a0,a0
            .he aa,aa,aa,aa,aa,aa,aa,aa
            .he 0a,0a,aa,aa,aa,aa,0a,0a
            .he a0,a0,a0,a0,a0,a0,a0,a0
            .he 0a,0a,0a,0a,0a,0a,0a,0a
            .he 0,0,0,0,aa,aa,aa,aa
            .he aa,aa,aa,aa,0,0,0,0
            .he a0,a0,a0,a0,aa,aa,aa,aa
            .he aa,aa,aa,aa,a0,a0,a0,a0
            .he 0a,0a,0a,0a,aa,aa,aa,aa
            .he aa,aa,aa,aa,0a,0a,0a,0a

            .he 90,90,99,99,99,99,90,90
            .he 99,99,99,99,99,99,99,99
            .he 09,09,99,99,99,99,09,09
            .he 90,90,90,90,90,90,90,90
            .he 09,09,09,09,09,09,09,09
            .he 0,0,0,0,99,99,99,99
            .he 99,99,99,99,0,0,0,0
            .he 90,90,90,90,99,99,99,99
            .he 99,99,99,99,90,90,90,90
            .he 09,09,09,09,99,99,99,99
            .he 99,99,99,99,09,09,09,09

            .he 80,80,88,88,88,88,80,80
            .he 88,88,88,88,88,88,88,88
            .he 08,08,88,88,88,88,08,08
            .he 80,80,80,80,80,80,80,80
            .he 08,08,08,08,08,08,08,08
            .he 0,0,0,0,88,88,88,88
            .he 88,88,88,88,0,0,0,0
            .he 80,80,80,80,88,88,88,88
            .he 88,88,88,88,80,80,80,80
            .he 08,08,08,08,88,88,88,88
            .he 88,88,88,88,08,08,08,08

            .he 70,70,77,77,77,77,70,70
            .he 77,77,77,77,77,77,77,77
            .he 07,07,77,77,77,77,07,07
            .he 70,70,70,70,70,70,70,70
            .he 07,07,07,07,07,07,07,07
            .he 0,0,0,0,77,77,77,77
            .he 77,77,77,77,0,0,0,0
            .he 70,70,70,70,77,77,77,77
            .he 77,77,77,77,70,70,70,70
            .he 07,07,07,07,77,77,77,77
            .he 77,77,77,77,07,07,07,07

            .he 60,60,66,66,66,66,60,60
            .he 66,66,66,66,66,66,66,66
            .he 06,06,66,66,66,66,06,06
            .he 60,60,60,60,60,60,60,60
            .he 06,06,06,06,06,06,06,06
            .he 0,0,0,0,66,66,66,66
            .he 66,66,66,66,0,0,0,0
            .he 60,60,60,60,66,66,66,66
            .he 66,66,66,66,60,60,60,60
            .he 06,06,06,06,66,66,66,66
            .he 66,66,66,66,06,06,06,06

            .he 50,50,55,55,55,55,50,50
            .he 55,55,55,55,55,55,55,55
            .he 05,05,55,55,55,55,05,05
            .he 50,50,50,50,50,50,50,50
            .he 05,05,05,05,05,05,05,05
            .he 0,0,0,0,55,55,55,55
            .he 55,55,55,55,0,0,0,0
            .he 50,50,50,50,55,55,55,55
            .he 55,55,55,55,50,50,50,50
            .he 05,05,05,05,55,55,55,55
            .he 55,55,55,55,05,05,05,05

            .he 40,40,44,44,44,44,40,40
            .he 44,44,44,44,44,44,44,44
            .he 04,04,44,44,44,44,04,04
            .he 40,40,40,40,40,40,40,40
            .he 04,04,04,04,04,04,04,04
            .he 0,0,0,0,44,44,44,44
            .he 44,44,44,44,0,0,0,0
            .he 40,40,40,40,44,44,44,44
            .he 44,44,44,44,40,40,40,40
            .he 04,04,04,04,44,44,44,44
            .he 44,44,44,44,04,04,04,04

            .he 30,30,33,33,33,33,30,30
            .he 33,33,33,33,33,33,33,33
            .he 03,03,33,33,33,33,03,03
            .he 30,30,30,30,30,30,30,30
            .he 03,03,03,03,03,03,03,03
            .he 0,0,0,0,33,33,33,33
            .he 33,33,33,33,0,0,0,0
            .he 30,30,30,30,33,33,33,33
            .he 33,33,33,33,30,30,30,30
            .he 03,03,03,03,33,33,33,33
            .he 33,33,33,33,03,03,03,03

            .he 20,20,22,22,22,22,20,20
            .he 22,22,22,22,22,22,22,22
            .he 02,02,22,22,22,22,02,02
            .he 20,20,20,20,20,20,20,20
            .he 02,02,02,02,02,02,02,02
            .he 0,0,0,0,22,22,22,22
            .he 22,22,22,22,0,0,0,0
            .he 20,20,20,20,22,22,22,22
            .he 22,22,22,22,20,20,20,20
            .he 02,02,02,02,22,22,22,22
            .he 22,22,22,22,02,02,02,02

            .he 10,10,11,11,11,11,10,10
            .he 11,11,11,11,11,11,11,11
            .he 01,01,11,11,11,11,01,01
            .he 10,10,10,10,10,10,10,10
            .he 01,01,01,01,01,01,01,01
            .he 0,0,0,0,11,11,11,11
            .he 11,11,11,11,0,0,0,0
            .he 10,10,10,10,11,11,11,11
            .he 11,11,11,11,10,10,10,10
            .he 01,01,01,01,11,11,11,11
            .he 11,11,11,11,01,01,01,01

... jetzt gehe ich die Player an... 😉

AntwortZitat

... jetzt habe ich doch noch ein wenig mit der letzten Reihe experimentiert und hin und her programmiert - kleine Fehler lassen mich einfach so lange nicht los, bis ich es "habe" ... die Lösung war mal wieder die Displaylist!! Habe es folgendermaßen geändert:

dlist   .byte 112,112,112,100
    .byte 30,75
    .byte 36,36,36,36,36,36,36,36,36,36,36,36
    .byte 36,36,36,36,36,36,36,36,36,4,112
    .byte 65,32,156

weil meine Frau die braune Farbe nicht so mag, habe ich die Farbtabelle auch noch angepasst:

    mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
    mva #170 color4 ;Hintergrundfarbe / Helligkeit festlegen    

jetzt noch vor jeder "jsr umschalten" Routine die Warteschleife anspringen:

    mva #1 delay
    jsr wartes
    jsr umschalten          ;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar

und jetzt läuft der Feinscroll wirklich perfekt!! Bin echt mehr als zufrieden!

Liebe Grüße Peter

AntwortZitat

Ein paar wohl bekannte Vorabüberlegungen zur PM-Graphik: Hier habe ich mal die wichtigsten Register zusammengetragen:

SDMCTL $22F 559 - kontrolliert den direkten Speicherzugriff des Antic auf den Computer - Schattenregister von DMACTL ($D400,54272) -> 3E. (62) oder 3A (58) =32 DMA für DL ein/aus + 2 Anzeigefeld 40 Zeichen + 28 Bit 2,3,4 Bit 2: Missile ein/aus Bit 3: Player+Missile ein/aus Bit 4: 0 zweizeilig / 1 einzeilig

HPOSP0-3 $$D000/$D003 53248-53251 - horizontale Position der Player sichtbar zwischen $30-$D0(48-208)

SIZEP0-P3 $D008-0B 53256-53259 Breite der Player: 0,2 normal 1 doppelt 3 vierfach

PCOLR0-3 $2C0 - $2C3 (704-707) Playerfarbe

PMBAS $D407 54279 Beginn Speicherbereich PM 1kB Grenze (2 zeilig) 2kB Grenze (1 zeilig) Peek(106)-16 -> Poke 54279

GRACTL $D01D 53277 kontrolliert PM /+Joystick für PM Bit 0 (1) = Missiles ein/aus Bit 1 (2) = Player an/aus Bit 2 (4) = Drücken der Knöpfe wird gespeichert

HITCLR $D01E 53278 = beliebiger Wert löscht alle Kollisionsregister

PRIOR $D01B 53275 Rangfolge der Player

VDELAY $D01C 53276 Verschiebung der PM wenn zweizeilig über eine Zeile

Wenn man mehrere Farben für einen Player haben möchte, dann muss man Player überlagern, oder gibt es da noch andere Wege??? Gruß

AntwortZitat

... alles in Assembler ist irgendwie viel viel schwieriger! Nun ist es die Geschwindigkeit!! Ich habe den Player erstellt (also das Raumschiff) und wollte nun mal kurz die Joysticksteuerung nur nach rechts und links einbinden... und plopp da ist schon die nächste Hürde! Noch habe ich keine vernünftige Lösung. Sobald ich eine Joystickabfrage z.B. nach rechts mache und den HPOSP0 Wert - also den horizontalen Werte - für Player 1 erhöhe ist der Player komplett weg. Wenn ich den maximal sichtbaren Wert abfange, dann springt der Player sofort von der aktuellen Position zur Position ganz nach rechts... ich sehe keine Bewegung. Alles mal kurz in Basic nachprogrammiert - und natürlich passiert das auch hier, wenn man den Wert in Basic von 1 Inkrement auf 0,1 verkleinert, dann geht es, es ist also ein Zeitproblem. Der Assembler ist definitiv zu schnell.... und ich habe es noch nicht hinbekommen das Abfragetiming so zu machen, dass man eine schöne flüssige Bewegung des Players sieht... Wer hat da Erfahrung und die passende Idee?? LG Peter

AntwortZitat

Im VBI oder DLI den player setzen. Im normalen Programmcode nur die Abfrage machen und die neue Position speichern.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

Also im normalen Code die Joystickabfrage machen und den neuen x-Werte in eine Variable abspeichern, im DLI oder VBI dann entsprechend den neuen x-Wert in die HPOSP0 einspeichern?

AntwortZitat

Genau so wird es klappen.

Wenn es dann noch zu schnell ist, auch die Abfrage nur im interrupt machen.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

ich biege also die Vektoren $200 und $201 auf meine Assemblerroutine für die Speicherung der HPOSP0 z.B. schreibe in NMIEN 192 und schon wird der Interrupt ausgelöst über mein Programm welches mit RTI beendet wird? Ich hätte erwartet, daß das dann noch schneller läuft... Evt. baue ich die gesamte Routine - also incl. Joystickabfrage in den Code mit ein??!!

AntwortZitat

Ob im DLI oder VBI hängt davon ab, wo Du am meisten Zeit übrig hast.

Wenn Du den DLI nutzt denke dran, die verwendeten Register vorher zu retten und dann diese vor dem RTI zurück zu schreiben. Sonst hast Du Fehler, die Du Dir nicht erklären kannst.

Nutzt Du in Deiner Routine nur den Akku und das X Register, sieht die DLI Routine dann etwa so aus:

DLI

   pha
   txa
   pha

   Nun Deine Routine... 

   pla
   tax
   pla
   rti

Initialisiert wird der DLI, wie oben von Dir beschrieben.

   mwa #DLI $200

Allerdings wird er nur ausgelöst, wenn es auch in der DL einen entsprechenden Eintrag (eine Zeile mit +$80) gibt.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

reicht MVA DLI $200 aus? Muss nicht das HiByte von DLI noch in $201?

AntwortZitat

Deshalb ist es ja auch ein mwa 😉

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

Neues update:

Also der Displaylistinterrupt lief irgendwie nicht... schwarzer Bidlschirm! Ich habe es jetzt im VBI gemacht! Zunächst habe ich nur den Part des Codes in den VBI gepackt, der den neuen Wert in die horizontale Position des Players schreibt. Das geht, ist aber ruckelig.... logischerweise! Also habe ich das Programm angepasst und komplett in den VBI gestackt. Und nun läuft die Steuerung echt flüssig und gut. Dabei habe ich zunächst nur die Bewegung nach rechts und links programmiert. Die Bewegung vertikal ist etwas aufwendiger und mache ich im Anschluß. Den Code stelle ich gleich rein. Dabei habe ich den Header etwas verändert und nehme einen aus dem Netz (von mir noch mit meinen Variablen erweitert), da hier alle (!!) Adressen drin sind!

Nun mache ich mir folgende Gedanken: Auch die ganze Bewegung in vertikaler Richtung muss in den VBI. Am besten auch noch die Kollisionsabfrage und die Schüsse... nun mache ich mir natürlich echte Sorgen, ob das vom Zeittiming passt. Im VBI bekomme ich ca. 8900 Maschinenzyklen unter, mein jetziges Programm im VBI benötigt ca. 120 Taktzyklen. Jeder Befehl braucht so ca. 1-6 Taktzyklen... ist 1 Taktzyklus identisch mit einem Maschinenzyklus? Wieviele Assemblerbefehle bekomme ich dann in den VBI rein ohne Probleme?? Wenn man mal im Schnitt 2-3 Taktzyklen pro Befehl im Schnitt annimmt, wären das ja ca. 3500 Befehle... ne Menge, wenn das stimmt! Oder habe ich mich verrechnet??

Nun der Header:

LINZBS   = $0000
CASINI   = $0002
RAMLO    = $0004
TRAMSZ   = $0006
TSTDAT   = $0007
WARMST   = $0008
BOOT?    = $0009
DOSVEC   = $000a
DOSINI   = $000c
APPMHI   = $000e
POKMSK   = $0010
BRKKEY   = $0011
RTCLOK   = $0012
BUFADR   = $0015
ICCOMT   = $0017
DSKFMS   = $0018
DSKUTL   = $001a
PTIMOT   = $001c
PBPNT    = $001d
PBUFSZ   = $001e
PTEMP    = $001f
ICHIDZ   = $0020
ICDNOZ   = $0021
ICCOMZ   = $0022
ICSTAZ   = $0023
ICBALZ   = $0024
ICPTLZ   = $0026
ICBLLZ   = $0028
ICAX1Z   = $002a
ICAX2Z   = $002b
ICAX3Z   = $002c
ICAX4Z   = $002c
ICAX5Z   = $002e
ICAX6Z   = $002f
STATUS   = $0030
CHKSUM   = $0031
BUFRLO   = $0032
BUFRHI   = $0033
BFENLO   = $0034
BFENHI   = $0035
CRETRY   = $0036
DRETRY   = $0037
BUFRFL   = $0038
RECVDN   = $0039
XMTDON   = $003a
CHKSNT   = $003b
NOCKSM   = $003c
BPTR     = $003d
FTYPE    = $003e
FEOF     = $003f
FREQ     = $0040
SOUNDR   = $0041
CRITIC   = $0042
FMZSPG   = $0043
ZDRVA    = $0045
ZSBA     = $0047
ERRNO    = $0049
CKEY     = $004a
CASSBT   = $004b
DSTAT    = $004c
ATRACT   = $004d
DRKMSK   = $004e
COLRSH   = $004f
TMPCHR   = $0050
HOLD1    = $0051
LMARGN   = $0052
RMARGN   = $0053
ROWCRS   = $0054
COLCRS   = $0055
DINDEX   = $0057
SAVMSC   = $0058
OLDROW   = $005a
OLDCOL   = $005b
OLDCHR   = $005d
OLDADR   = $005e
NEWROW   = $0060
NEWCOL   = $0061
LOGCOL   = $0063
ADRESS   = $0064
MLTTMP   = $0066
SAVADR   = $0068
RAMTOP   = $006a
BUFCNT   = $006b
BUFSTR   = $006c
BITMSK   = $006e
SHFAMT   = $006f
ROWAC    = $0070
COLAC    = $0072
ENDPT    = $0074
DELTAR   = $0076
DELTAC   = $0077
ROWINC   = $0079
COLINC   = $007a
SWPFLG   = $007b
HOLDCH   = $007c
INSDAT   = $007d
COUNTR   = $007e

; hardware shadow registers
VDSLST   = $0200
VPRCED   = $0202
VINTER   = $0204
VBREAK   = $0206
VKEYBD   = $0208
VSERIN   = $020a
VSEROR   = $020c
VSEROC   = $020e
VTIMR1   = $0210
VTIMR2   = $0212
VTIMR4   = $0214
VIMIRQ   = $0216
CDTMV1   = $0218
CDTMV2   = $021a
CDTMV3   = $021c
CDTMV4   = $021e
CDTMV5   = $0220
VVBLKI   = $0222
VVBLKD   = $0224
CDTMA1   = $0226
CDTMA2   = $0228
CDTMF3   = $022a
SRTIMR   = $022b
CDTMF4   = $022c
INTEMP   = $022d
CDTMF5   = $022e
SDMCTL   = $022f
SDLSTL   = $0230
SSKCTL   = $0232
SPARE    = $0233
LPENH    = $0234
LPENV    = $0235
BRKKY    = $0236
CDEVIC   = $023a
CCOMND   = $023b
CAUX1    = $023c
CAUX2    = $023d
TEMP     = $023e
ERRFLG   = $023f
DFLAGS   = $0240
DBSECT   = $0241
BOOTAD   = $0242
COLDST   = $0244
DSKTIM   = $0246
LINBUF   = $0247
GPRIOR   = $026f
PADDL0   = $0270
PADDL1   = $0271
PADDL2   = $0272
PADDL3   = $0273
PADDL4   = $0274
PADDL5   = $0275
PADDL6   = $0276
PADDL7   = $0277
STICK0   = $0278
STICK1   = $0279
STICK2   = $027a
STICK3   = $027b
PTRIG0   = $027c
PTRIG1   = $027d
PTRIG2   = $027e
PTRIG3   = $027f
PTRIG4   = $0280
PTRIG5   = $0281
PTRIG6   = $0282
PTRIG7   = $0283
STRIG0   = $0284
STRIG1   = $0285
STRIG2   = $0286
STRIG3   = $0287
CSTAT    = $0288
WMODE    = $0289
BLIM     = $028a
TXTROW   = $0290
TXTCOL   = $0291
TINDEX   = $0293
TXTMSC   = $0294
TXTOLD   = $0296
TMPX1    = $029c
HOLD3    = $029d
SUBTMP   = $029e
HOLD2    = $029f
DMASK    = $02a0
TMPLBT   = $02a1
ESCFLG   = $02a2
TABMAP   = $02a3
LOGMAP   = $02b2
INVFLG   = $02b6
FILFLG   = $02b7
TMPROW   = $02b8
TMPCOL   = $02b9
SCRFLG   = $02bb
HOLD4    = $02bc
HOLD5    = $02bd
SHFLOK   = $02be
BOTSCR   = $02bf
PCOLR0   = $02c0
PCOLR1   = $02c1
PCOLR2   = $02c2
PCOLR3   = $02c3
COLOR0   = $02c4
COLOR1   = $02c5
COLOR2   = $02c6
COLOR3   = $02c7
COLOR4   = $02c8

; IO space
RUNAD    = $02e0
INITAD   = $02e2
RAMSIZ   = $02e4
MEMTOP   = $02e5
MEMLO    = $02e7
DVSTAT   = $02ea
CBAUDL   = $02ee
CBAUDH   = $02ef
CRSINH   = $02f0
KEYDEL   = $02f1
CH1      = $02f2
CHACT    = $02f3
CHBAS    = $02f4
CHAR     = $02fa
ATACHR   = $02fb
CH       = $02fc
FILDAT   = $02fd
DSPFLG   = $02fe
SSFLAG   = $02ff
DDEVIC   = $0300
DUNIT    = $0301
DCOMND   = $0302
DSTATS   = $0303
DBUFLO   = $0304
DBUFHI   = $0305
DTIMLO   = $0306
DUNUSE   = $0307
DBYTLO   = $0308
DBYTHI   = $0309
DAUX1    = $030a
DAUX2    = $030b
TIMER1   = $030c
ADDCOR   = $030e
CASFLG   = $030f
TIMER2   = $0310
TEMP1    = $0312
TEMP2    = $0314
TEMP3    = $0315
SAVIO    = $0316
TIMFLG   = $0317
STACKP   = $0318
TSTAT    = $0319
HATABS   = $031a
IOCB0    = $0340
IOCB1    = $0350
IOCB2    = $0360
IOCB3    = $0370
IOCB4    = $0380
IOCB5    = $0390
IOCB6    = $03a0
IOCB7    = $03b0
PRNBUF   = $03c0
CASBUF   = $03fd

; GTIA write locations
HPOSP0   = $d000
HPOSP1   = $d001
HPOSP2   = $d002
HPOSP3   = $d003
HPOSM0   = $d004
HPOSM1   = $d005
HPOSM2   = $d006
HPOSM3   = $d007
SIZEP0   = $d008
SIZEP1   = $d009
SIZEP2   = $d00a
SIZEP3   = $d00b
SIZEM    = $d00c
GRAFP0   = $d00d
GRAFP1   = $d00e
GRAFP2   = $d00f
GRAFP3   = $d010
GRAFM    = $d011
COLPM0   = $d012
COLPM1   = $d013
COLPM2   = $d014
COLPM3   = $d015
COLPF0   = $d016
COLPF1   = $d017
COLPF2   = $d018
COLPF3   = $d019
COLBK    = $d01a
PRIOR    = $d01b
VDELAY   = $d01c
GRACTL   = $d01d
HITCLR   = $d01e
CONSOL   = $d01f

; GTIA read locations
M0PF     = $d000
M1PF     = $d001
M2PF     = $d002
M3PF     = $d003
P0PF     = $d004
P1PF     = $d005
P2PF     = $d006
P3PF     = $d007
M0PL     = $d008
M1PL     = $d009
M2PL     = $d00a
M3PL     = $d00b
P0PL     = $d00c
P1PL     = $d00d
P2PL     = $d00e
P3PL     = $d00f
TRIG0    = $d010
TRIG1    = $d011
TRIG2    = $d012
TRIG3    = $d013
PAL      = $d014

; POKEY write locations
AUDF1    = $d200
AUDC1    = $d201
AUDF2    = $d202
AUDC2    = $d203
AUDF3    = $d204
AUDC3    = $d205
AUDF4    = $d206
AUDC4    = $d207
AUDCTL   = $d208
STIMER   = $d209
SKREST   = $d20a
POTGO    = $d20b
SEROUT   = $d20d
IRQEN    = $d20e
SKCTL    = $d20f

; POKEY read locations
POT0     = $d200
POT1     = $d201
POT2     = $d202
POT3     = $d203
POT4     = $d204
POT5     = $d205
POT6     = $d206
POT7     = $d207
ALLPOT   = $d208
KBCODE   = $d209
RANDOM   = $d20a
SERIN    = $d20d
IRQST    = $d20e
SKSTAT   = $d20f

; PIA
PORTA    = $d300
PORTB    = $d301
PACTL    = $d302
PBCTL    = $d303

; ANTIC write locations
DMACTL   = $d400
CHACTL   = $d401
DLISTL   = $d402
DLISTH   = $d403
HSCROL   = $d404
VSCROL   = $d405
PMBASE   = $d407
CHBASE   = $d409
WSYNC    = $d40a
NMIEN    = $d40e
NMIRES   = $d40f

; ANTIC read locations
VCOUNT   = $d40b
PENH     = $d40c
PENV     = $d40d
NMIST    = $d40f
 NMIEN_DLI = $80
 NMIEN_VBI = $40

; vector tables
EDITRV   = $e400
SCRENV   = $e410
KEYBDV   = $e420
PRINTV   = $e430
CASETV   = $e440
DISKIV   = $e450
DSKINV   = $e453
CIOV     = $e456
SIOV     = $e459
SETVBV   = $e45c
SYSVBV   = $e45f
XITVBV   = $e462
SIOINV   = $e465
SENDEV   = $e468
INTINV   = $e46b
CIOINV   = $e46e
BLKBDV   = $e471
WARMSV   = $e474
COLDSV   = $e477
RBLOKV   = $e47a
CSOPIV   = $e47d

var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
var6 = $b2
var7 = $b4
lms1 = $b6
lms2 = $b8
lmslo = $a0
lmshi = $a2
delay = $b0

play1 = $92
play2 = $94
play3 = $96
play4 = $98

miss1 = $c0
miss2 = $c2
miss3 = $c4
miss4 = $c6
rechts = $c8
links = $c9
posp1 = $ca
posp2 = $cb
joyst1 = $cc

Und hier der Code:

            org $2000

            icl '../hardware.txt'
            icl 'character.asm'
            icl 'lands.asm' 

dlist           .byte 112,112,112,100
            .byte 30,75
            .byte 36,36,36,36,36,36,36,36,36,36,36,36
            .byte 36,36,36,36,36,36,36,36,36,4,112
            .byte 65,32,156

pm1         .byte 24,60,36,36,126,126,255,219,219,129,129,129



            .proc main

            jsr displaylist ;Subroutine Displaylist-Aufbau

Start1          mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
            mva #192 gprior ;GTIA Modus 3 (16 Farben) initialisieren
            mva #170 color4 ;Hintergrundfarbe / Helligkeit festlegen        
            lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1
            mva <lands var6
            mva >lands var6+1

            ; Player vorbereiten und initialisieren

            lda ramtop
            sec
            sbc #16
            sta pmbase
            clc
            adc #4
            sta play1+1
            mva #62 sdmctl
            mva #120 posp1
            mva #220 pcolr0
            mva #193 gprior
            mva #3 gractl
            mva #1 sizep0
            mva #0 rechts

            ldy #255                ;Speicher Player 1 leeren
            lda #0
            sta play1
@           sta (play1),y
            dey
            bpl @-
            clc
            ldy #80                 ;verticale Startpos. Player 1 + füllen
            ldx #0
@           lda pm1,x
            sta (play1),y
            iny
            inx
            cpx #12
            bne @-

            ldx #>vbinter           ;VB-Interrupt VektorHi
            ldy #<vbinter           ;VB-Interrupt VektorLo
            lda #7                  ;Deferred Mode mit lda #7 festlegen
            jsr setvbv              ;Vektor für die eigene Routine über setvbv eintragen



hauptprogramm




            jsr letztereihe         ;letzte Reihe (lands) Bildschirm1 printen (sichtbar)    
            jsr feinscroll          ;Feinscroll Bildschirm1 ausführen (sichtbar)

            mva #$30 var1           ;var1 auf 30000 ($7530) setzen
            mva #$75 var1+1
            mva #$f0 var2           ;var2 auf 30960 ($78f0) setzen
            mva #$78 var2+1

            jsr grobscroll          ;Bildschirm1 kopieren + grobscroll

            mva #$18 var1           ;var1 + var2 auf 31000 ($7918) setzen
            mva #$18 var2
            mva #$79 var1+1
            mva #$79 var2+1 

            mva #1 delay
            jsr wartes

            jsr umschalten          ;umschalten auf Bildschirm2 - Bildschirm2 wird sichtbar 
            jsr letztereihe
            jsr feinscroll          ;Feinscroll Bildschirm2 ausführen (sichtbar)                        

            mva #$08 var2           ;var1 auf 29960 ($7508) setzen
            mva #$75 var2+1
            mva #$18 var1           ;var2 auf 31000 ($7918) setzen
            mva #$79 var1+1

            jsr grobscroll          ;;Bildschirm2 kopieren + grobscroll

            mva #$30 var1           ;var1 + var2 auf 30000 ($7530) setzen
            mva #$30 var2
            mva #$75 var1+1
            mva #$75 var2+1

            mva #1 delay
            jsr wartes
            jsr umschalten          ;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar


            ;Ende der Bildschirmausführung / Kontrolle Durchläufe

            sec
            lda #38                 ; - 36 = Anzahl der Durchläufe
            sbc var6+1
            bpl @+

            jmp start1                      ;Stop hier

@           jmp hauptprogramm               ;weiter

            .endp

            ; _____________________________________________________________________________________
            ;
            ; ---------------------------- S U B R O U T I N E N ----------------------------------
            ; _____________________________________________________________________________________




                                ;vertical blank interrupt für Joystick / PM

vbinter         
            pha
            txa
            pha
            sec                 ;Abfrage Joystick
            lda stick0
            cmp #8
            bcs @+
            jmp nachre
@           clc
            lda stick0
            cmp #15
            bcs @+
            sec
            lda stick0
            cmp #12
            bcs @+
            jmp nachli
@           clc
            jmp write
nachre      clc
            lda posp1
            cmp #192
            bcs @+
            inc posp1
@           jmp write
nachli      sec
            lda posp1
            cmp #49
            bcc @+
            dec posp1
@           clc
write       lda posp1 
            sta hposp0
            pla
            tax
            pla
            jmp xitvbv          ;vb-interrupt wird über xitvbv beendet!!



            ; -------------------------------------------------------------------------------------

umschalten
            ldy #4              ;Bildschirme umschalten von unsichtbar auf sichtbar 
            mva sdlstl var5
            mva sdlstl+1 var5+1
            lda var1
            sta (var5),y
            iny
            lda var1+1
            sta (var5),y
            rts

            ; -------------------------------------------------------------------------------------

wartes      
            clc
            ldx delay ; Warteschleife
st          lda RTCLOK+2    
wa          cmp RTCLOK+2    
            beq wa    
            dex            
            bpl st 
            rts

            ; -------------------------------------------------------------------------------------

feinscroll
            ldy #1
            mva #1 delay
@           jsr wartes
            sty vscrol
            iny
            cpy #8
            bne @-          
            rts

            ; --------------------------------------------------------------------------------------

grobscroll  
            ;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile

            ldx #22
@           ldy #$28
            clc
@           mva (var1),y (var2),y
            dey
            bpl @-
            clc
            lda var1
            adc #$28
            sta var1
            bcc @+
            inc var1+1
@           clc
            lda var2
            adc #$28
            sta var2
            bcc @+
            inc var2+1          
@           clc
            dex
            bpl @-3
            rts

            ; -------------------------------------------------------------------------------

displaylist
            ; initialisiere die Displaylist
            mva sdlstl var5
            mva sdlstl+1 var5+1
            ldy #0
            clc
@           lda dlist,y
            sta (var5),y
            iny
            cpy #34
            bne @-
            rts

            ; ---------------------------------------------------------------------------------------

letztereihe
            ;Die letzte Reihe printen 
            ;Start der letzten Reihe bei var1 - Line 22
            lda var1
            adc #112
            sta var1
            inc var1+1
            inc var1+1
            inc var1+1
            ldy #0
            clc



            lda (var6),y ;Boarder1 holen
            sta var5    ;Boarderanzahl in var5 speichern
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1          
            lda (var6),y
            ldy var5



@           sta (var1),y ;Boarder1 printen
            dey
            bpl @-          
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda (var6),y ;Rand Boarder1 holen
            inc var5    ;Zeilenzähler eins weiter
            ldy var5
            sta (var1),y ;Rand Boarder1 printen
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda(var6),y ;leer holen
            tax
            lda #0
            ldy var5            
@           iny          
            sta (var1),y ; leer printen
            dex
            bpl @-



            sty var5 ;Zeilenzähler sichern
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  

            lda(var6),y ;Rand Boarder2 holen
            ldy var5
            iny
            sty var5
            sta (var1),y ;Rand Boarder2 printen
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  



            lda(var6),y ;Boarder2 holen
            tax     ;Boarderanzahl in x speichern
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1  
            lda (var6),y
            ldy var5
@           iny
            sta (var1),y    ;Boarder2 printen
            dex
            bpl @-
            clc
            lda var6
            adc #1
            sta var6
            ldy #0
            lda var6+1
            adc #0
            sta var6+1
            mva #0 vscrol
            rts

            ; ------------------------------------------------------------------------------


            run main


AntwortZitat

Ich habe nochmal nachgeschaut und es scheint tatsächlich so zu sein:

Der Atari 6502 Prozessor arbeitet mit einer Taktfrequenz von 1,77 MHz (PAL-System), somit dauert ein Taktzyklus beim Atari also ca. 0,56 Mikrosekunden. Die Befehle benötigen 1-7 Taktzyklen, also rechne ich mal schlecht im Schnitt 5 Taktzyklen pro Befehl im Durchscnitt, also 2,8 Mikrosekunden.

Der VBI dauert beim PAL-System 4500 Mikrosekunden. Mir stehen also im Schnitt ca. 1600 Befehle im VBI zur Verfügung. Damit kann man schon ne Menge machen, für die rechts / links - Steuerung habe ich gerade mal 36 Befehle gebraucht. Mit 1600 Befehlen müsste ich eigentlich alles gut im VBI unterbringen... hoffe, ich habe mich nicht verrechnet!! LG Peter

AntwortZitat

Ich habe jetzt Player 1 (mein Raumschiff) mit der kompletten Steuerung incl. Kollisionsabfrage ausgestattet, die Steuerung läuft jetzt sehr schön im vertikal blank interrupt und ich hoffe noch genügen Zeit zu haben, um die ganzen Missiles dort auch unterzubringen. Ich möchte dabei alle 4 Missiles verwenden, so daß maximal 4 Schüsse gleichzeitig sichtbar sind und entsprechend zum Ziel laufen können. Bei der Erstellung des ersten Missile kam dann das nächste Problem: Ich habe es nicht so richtig hinbekommen und das lag tatsächlich an der scheinbaren Kompliziertheit, gepaart mit eigenem Unwissen und wie ich finde für mich nicht so ganz klarer Erklärung wie die Dinger funktionieren in sämtlichen Büchern/Quellen..... für den Profi vielleicht unverständlich, aber ein paar Dinge muss man einfach wissen, weil sie zwar sinnvoll sein mögen (aus Sicht des Atari-Konstrukteurs damals) - dennoch recht uneingänglich wirken! Jetzt weiß ich auch, warum ich damals immer einen Bogen um die PM-Grafik gemacht habe. Für alle, die auch Schwierigkeiten damit haben folgende Erklärungen: Ich poste das hier mal in Dezimal und in Assembler braucht man natürlich nicht Poke sondern schreibt das einfach in die Speicherstelle rein.

Ich brauche SDMCTL. (559) - hiemit kann der Grafikchip auf den Speicher zugreifen. Z.B. Poke 559,62 Die horizontale Positionen der Missiles stehen in den Stellen 53252-53255. für Missile 1-4 Die Farben der Missile orientieren sich an den Farben der Player - sind also prinzipiell jeweils gleich und werden in den Stellen 704-707 gesetzt. Mit GPRIOR (Poke 623) kann ich die Player und Missiles manipulieren (Vordergrund / Hintergrund) - zB Poke 623,1 -> zeigt alle Player und Missile Wir brauchen noch GRACTL (Poke 53277) - schaltet Player und Missile (sowie Feuerknopfspeicherung) ein und aus -> Bit 0 und 1 (also Poke 53277,3) und schon zeigt er alle Player und Missiles an (wenn Daten hinterlegt sind).

Soweit alles easy... jetzt kommt der Knacker: Die PMBASE (54279)... hier startet die Basisadresse für die Daten der PM-Grafik. Die PMBASE ist nur als HI-BYTE anzusprechen und kann die 1024 bzw. 2048 Grenze (einzeilig / zweizeilig) nicht überspringen. Man könnte also sinnvollerweise RAMTOP (106) auslesen (z.B. steht da 160 -> 256160=40960) .... wenn ich jetzt z.B. 16 abziehe und entsprechend 144 in die PMBASE schreibe, dann beginnt mein PM-Speicher bei 144256=36864. Ich könnte auch tiefer gehen, aber 144*256 funktioniert gut und sinnvoll, der PM-Speicher ist dann relativ knapp unterhalb des Bildschirmspeichers. Der erste Player fängt dann bei PMBASE + 1024 an, der 2. jeweils +256! Wo aber sind die Missiles?? Diese fangen alle (!!!) bei PMBASE+768 an. Das ist wichtig und ein wenig verwirrend... wenn man es nicht weiß und auch nirgends gut erklärt. Der Trick an der Sache ist folgender: In Jedem Byte von PMBASE+768 bis PMBASE+1023 stecken alle Missiles zugleich - nämlich in jeweils Bit 0,1 Missile 1 in Bit 2,3 für Missile 2 Bit 4,5 Missile 3 und Bit 6,7 Missile 4. Je nachdem was ich in die Bits reinschreibe, stelle ich Teile der Missiles dar oder auch nicht. Die jeweilig y-Position ist dann logischerweise wie der Player zwischen PMBASE+768 und PMBASE+1023. Daher kann man auch alle 4 Missiles wie einen Player betrachten, der nur quasr auseinandergerissen werden kann - und natürlich entsprechend auch wie ein gemeinsamer Player 5 benutzt werden kann. Für Missile 1 zB schreibe ich eine 3 in den Speicher, für Missile 2 eine 12, 48 für Missile 3 und 192 für Missile 4 ---- will ich auf einer Höhe beispielsweise Missile 1 und 3 abbilden, dann kommt 51 in den Speicher .... usw. Die x-Positionen lassen sich entsprechend separat steuern, auch die ganzen Kollisionsabfragen - mit einem Poke kann man das aber dann auch zusammenlegen ! Gruß

AntwortZitat

Wichtig noch daran zu denken, dass sich alle benötigten PM Adressen (also PMBASE+x) nochmals ändern, wenn man nicht 1-zeilige Player, sondern 2-zeilige Player nutzt.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

Hallo in die Runde... dies wird der letzte Post in Sachen "Charon" sein... ich schließe das Thema. Ich entwickele hier ein Spiel, was sehr stark dem alten Klassiker Phobos entspringt. Charon - auch ein Mond im Sonnensystem hat mich irgendwie vom Namen nie richtig überzeugt und ich werde ab sofort das Projekt umbenennen in:

Return to Phobos

AntwortZitat